14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CUDA struct types with interesting initialization properties.
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Keep in sync with ../SemaCUDA/Inputs/cuda-initializers.h.
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Base classes with different initializer variants.
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// trivial constructor -- allowed
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T {
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int t;
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// empty constructor
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct EC {
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ec;
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ EC() {}     // -- allowed
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ EC(int) {}  // -- not allowed
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// empty destructor
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ED {
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ~ED() {}     // -- allowed
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ECD {
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ECD() {}     // -- allowed
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ~ECD() {}    // -- allowed
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// empty templated constructor -- allowed with no arguments
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ETC {
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <typename... T> __device__ ETC(T...) {}
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// undefined constructor -- not allowed
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct UC {
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int uc;
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ UC();
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// undefined destructor -- not allowed
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct UD {
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ud;
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ~UD();
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// empty constructor w/ initializer list -- not allowed
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ECI {
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int eci;
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ECI() : eci(1) {}
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// non-empty constructor -- not allowed
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NEC {
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int nec;
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ NEC() { nec = 1; }
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// non-empty destructor -- not allowed
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NED {
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ned;
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ ~NED() { ned = 1; }
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// no-constructor,  virtual method -- not allowed
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NCV {
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ncv;
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ virtual void vm() {}
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// virtual destructor -- not allowed.
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct VD {
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ virtual ~VD() {}
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// dynamic in-class field initializer -- not allowed
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__device__ int f();
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NCF {
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ncf = f();
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// static in-class field initializer.  NVCC does not allow it, but
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// clang generates static initializer for this, so we'll accept it.
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// We still can't use it on __shared__ vars as they don't allow *any*
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// initializers.
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NCFS {
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ncfs = 3;
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// undefined templated constructor -- not allowed
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct UTC {
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <typename... T> __device__ UTC(T...);
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// non-empty templated constructor -- not allowed
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct NETC {
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int netc;
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <typename... T> __device__ NETC(T...) { netc = 1; }
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Regular base class -- allowed
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_B_T : T {};
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Incapsulated object of allowed class -- allowed
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_F_T {
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T t;
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// array of allowed objects -- allowed
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_FA_T {
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T t[2];
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Calling empty base class initializer is OK
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct EC_I_EC : EC {
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ EC_I_EC() : EC() {}
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// .. though passing arguments is not allowed.
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct EC_I_EC1 : EC {
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __device__ EC_I_EC1() : EC(1) {}
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Virtual base class -- not allowed
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_V_T : virtual T {};
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Inherited from or incapsulated class with non-empty constructor --
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// not allowed
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_B_NEC : NEC {};
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_F_NEC {
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NEC nec;
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_FA_NEC {
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NEC nec[2];
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Inherited from or incapsulated class with non-empty desstructor --
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// not allowed
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_B_NED : NED {};
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_F_NED {
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NED ned;
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T_FA_NED {
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NED ned[2];
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
146