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