brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 186b160 Raw
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