146 lines
2.7 KiB
C
146 lines
2.7 KiB
C
|
// 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];
|
||
|
};
|