// 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]; };