Viewing file: is_aggregate.C (2.82 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { dg-do run { target c++11 } } #include <cassert>
template<typename T> bool f() { return __is_aggregate(T); }
template<typename T> class My { public: bool f() { return !!__is_aggregate(T); } };
template<typename T> class My2 { public: static const bool trait = __is_aggregate(T); };
template<typename T> const bool My2<T>::trait;
template<typename T, bool b = __is_aggregate(T)> struct My3_help { static const bool trait = b; };
template<typename T, bool b> const bool My3_help<T, b>::trait;
template<typename T> class My3 { public: bool f() { return My3_help<T>::trait; } };
#define PTEST(T) (__is_aggregate(T) && f<T>() \ && My<T>().f() && My2<T>::trait && My3<T>().f())
#define NTEST(T) (!__is_aggregate(T) && !f<T>() \ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
struct A { int a, b, c; }; class B { static int a; private: static int b; public: int c; }; struct C { C () {} int a, b, c; }; struct D { explicit D (int) {} int a, b, c; }; struct E : public A { int d, e, f; }; struct F : public C { using C::C; int d, e, f; }; class G { int a, b; }; struct H { private: int a, b; }; struct I { protected: int a, b; }; struct J { int a, b; void foo (); }; struct K { int a, b; virtual void foo (); }; struct L : virtual public A { int d, e; }; struct M : protected A { int d, e; }; struct N : private A { int d, e; }; struct O { O () = delete; int a, b, c; }; struct P { P () = default; int a, b, c; }; typedef int T; typedef float U; typedef int V __attribute__((vector_size (4 * sizeof (int)))); typedef double W __attribute__((vector_size (8 * sizeof (double))));
int main () { assert (NTEST (void)); assert (NTEST (int)); assert (NTEST (double)); assert (NTEST (T)); assert (NTEST (U)); assert (PTEST (V)); assert (PTEST (W)); assert (PTEST (A)); assert (PTEST (B)); assert (NTEST (C)); assert (NTEST (D)); #if __cplusplus >= 201703L assert (PTEST (E)); #else assert (NTEST (E)); #endif assert (NTEST (F)); assert (NTEST (G)); assert (NTEST (H)); assert (NTEST (I)); assert (PTEST (J)); assert (NTEST (K)); assert (NTEST (L)); assert (NTEST (M)); assert (NTEST (N)); #if __cplusplus > 201703L assert (NTEST (O)); assert (NTEST (P)); #else assert (PTEST (O)); assert (PTEST (P)); #endif assert (PTEST (int[])); assert (PTEST (double[])); assert (PTEST (T[2])); assert (PTEST (U[])); assert (PTEST (V[])); assert (PTEST (W[])); assert (PTEST (A[19])); assert (PTEST (B[])); assert (PTEST (C[])); assert (PTEST (D[])); assert (PTEST (E[])); assert (PTEST (F[])); assert (PTEST (G[])); assert (PTEST (H[])); assert (PTEST (I[])); assert (PTEST (J[24])); assert (PTEST (K[])); assert (PTEST (L[])); assert (PTEST (M[6])); assert (PTEST (N[])); assert (PTEST (O[])); assert (PTEST (P[])); }
|