mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 18:16:06 +00:00

Some people have weird CI systems that run each test subdirectory independently without access to other parallel trees. Unfortunately, this means we have to suffer some duplication until Art can sort out how to share these types. llvm-svn: 270164
146 lines
2.7 KiB
C++
146 lines
2.7 KiB
C++
// CUDA struct types with interesting initialization properties.
|
|
// Keep in sync with ../CodeGenCUDA/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];
|
|
};
|