146 lines · c
1// CUDA struct types with interesting initialization properties.2// Keep in sync with ../SemaCUDA/Inputs/cuda-initializers.h.3 4// Base classes with different initializer variants.5 6// trivial constructor -- allowed7struct T {8 int t;9};10 11// empty constructor12struct EC {13 int ec;14 __device__ EC() {} // -- allowed15 __device__ EC(int) {} // -- not allowed16};17 18// empty destructor19struct ED {20 __device__ ~ED() {} // -- allowed21};22 23struct ECD {24 __device__ ECD() {} // -- allowed25 __device__ ~ECD() {} // -- allowed26};27 28// empty templated constructor -- allowed with no arguments29struct ETC {30 template <typename... T> __device__ ETC(T...) {}31};32 33// undefined constructor -- not allowed34struct UC {35 int uc;36 __device__ UC();37};38 39// undefined destructor -- not allowed40struct UD {41 int ud;42 __device__ ~UD();43};44 45// empty constructor w/ initializer list -- not allowed46struct ECI {47 int eci;48 __device__ ECI() : eci(1) {}49};50 51// non-empty constructor -- not allowed52struct NEC {53 int nec;54 __device__ NEC() { nec = 1; }55};56 57// non-empty destructor -- not allowed58struct NED {59 int ned;60 __device__ ~NED() { ned = 1; }61};62 63// no-constructor, virtual method -- not allowed64struct NCV {65 int ncv;66 __device__ virtual void vm() {}67};68 69// virtual destructor -- not allowed.70struct VD {71 __device__ virtual ~VD() {}72};73 74// dynamic in-class field initializer -- not allowed75__device__ int f();76struct NCF {77 int ncf = f();78};79 80// static in-class field initializer. NVCC does not allow it, but81// clang generates static initializer for this, so we'll accept it.82// We still can't use it on __shared__ vars as they don't allow *any*83// initializers.84struct NCFS {85 int ncfs = 3;86};87 88// undefined templated constructor -- not allowed89struct UTC {90 template <typename... T> __device__ UTC(T...);91};92 93// non-empty templated constructor -- not allowed94struct NETC {95 int netc;96 template <typename... T> __device__ NETC(T...) { netc = 1; }97};98 99// Regular base class -- allowed100struct T_B_T : T {};101 102// Incapsulated object of allowed class -- allowed103struct T_F_T {104 T t;105};106 107// array of allowed objects -- allowed108struct T_FA_T {109 T t[2];110};111 112 113// Calling empty base class initializer is OK114struct EC_I_EC : EC {115 __device__ EC_I_EC() : EC() {}116};117 118// .. though passing arguments is not allowed.119struct EC_I_EC1 : EC {120 __device__ EC_I_EC1() : EC(1) {}121};122 123// Virtual base class -- not allowed124struct T_V_T : virtual T {};125 126// Inherited from or incapsulated class with non-empty constructor --127// not allowed128struct T_B_NEC : NEC {};129struct T_F_NEC {130 NEC nec;131};132struct T_FA_NEC {133 NEC nec[2];134};135 136 137// Inherited from or incapsulated class with non-empty desstructor --138// not allowed139struct T_B_NED : NED {};140struct T_F_NED {141 NED ned;142};143struct T_FA_NED {144 NED ned[2];145};146