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