// CUDA struct types with interesting initialization properties.
// Keep in sync with ../SemaCUDA/Inputs/cuda-initializers.h.
// Base classes with different initializer variants.
// trivial constructor -- allowed
struct T {
int t;
};
// empty constructor
struct EC {
int ec;
__device__ EC() {} // -- allowed
__device__ EC(int) {} // -- not allowed
};
// empty destructor
struct ED {
__device__ ~ED() {} // -- allowed
};
struct ECD {
__device__ ECD() {} // -- allowed
__device__ ~ECD() {} // -- allowed
};
// empty templated constructor -- allowed with no arguments
struct ETC {
template <typename... T> __device__ ETC(T...) {}
};
// undefined constructor -- not allowed
struct UC {
int uc;
__device__ UC();
};
// undefined destructor -- not allowed
struct UD {
int ud;
__device__ ~UD();
};
// empty constructor w/ initializer list -- not allowed
struct ECI {
int eci;
__device__ ECI() : eci(1) {}
};
// non-empty constructor -- not allowed
struct NEC {
int nec;
__device__ NEC() { nec = 1; }
};
// non-empty destructor -- not allowed
struct NED {
int ned;
__device__ ~NED() { ned = 1; }
};
// no-constructor, virtual method -- not allowed
struct NCV {
int ncv;
__device__ virtual void vm() {}
};
// virtual destructor -- not allowed.
struct VD {
__device__ virtual ~VD() {}
};
// dynamic in-class field initializer -- not allowed
__device__ int f();
struct NCF {
int ncf = f();
};
// static in-class field initializer. NVCC does not allow it, but
// clang generates static initializer for this, so we'll accept it.
// We still can't use it on __shared__ vars as they don't allow *any*
// initializers.
struct NCFS {
int ncfs = 3;
};
// undefined templated constructor -- not allowed
struct UTC {
template <typename... T> __device__ UTC(T...);
};
// non-empty templated constructor -- not allowed
struct NETC {
int netc;
template <typename... T> __device__ NETC(T...) { netc = 1; }
};
// Regular base class -- allowed
struct T_B_T : T {};
// Incapsulated object of allowed class -- allowed
struct T_F_T {
T t;
};
// array of allowed objects -- allowed
struct T_FA_T {
T t[2];
};
// Calling empty base class initializer is OK
struct EC_I_EC : EC {
__device__ EC_I_EC() : EC() {}
};
// .. though passing arguments is not allowed.
struct EC_I_EC1 : EC {
__device__ EC_I_EC1() : EC(1) {}
};
// Virtual base class -- not allowed
struct T_V_T : virtual T {};
// Inherited from or incapsulated class with non-empty constructor --
// not allowed
struct T_B_NEC : NEC {};
struct T_F_NEC {
NEC nec;
};
struct T_FA_NEC {
NEC nec[2];
};
// Inherited from or incapsulated class with non-empty desstructor --
// not allowed
struct T_B_NED : NED {};
struct T_F_NED {
NED ned;
};
struct T_FA_NED {
NED ned[2];
};