]>
Commit | Line | Data |
---|---|---|
4b2e63de | 1 | // { dg-do compile { target c++11 } } |
c32097d8 JM |
2 | |
3 | // [basic.types]/10: | |
4 | // Scalar types, standard-layout class types (Clause 9), arrays of such | |
5 | // types and cv-qualified versions of these types (3.9.3) are collectively | |
6 | // called standard-layout types. | |
7 | ||
8 | // [class]/7: | |
9 | // A standard-layout class is a class that: | |
10 | // * has no non-static data members of type non-standard-layout class (or | |
11 | // array of such types) or reference, | |
12 | // * has no virtual functions (10.3) and no virtual base classes (10.1), | |
13 | // * has the same access control (Clause 11) for all non-static data members, | |
14 | // * has no non-standard-layout base classes, | |
15 | // * either has no non-static data members in the most-derived class and at | |
16 | // most one base class with non-static data members, or has no base classes | |
17 | // with non-static data members, and | |
18 | // * has no base classes of the same type as the first non-static data member. | |
19 | ||
20 | #include <type_traits> | |
21 | ||
22 | #define TRY(expr) static_assert (expr, #expr) | |
23 | #define YES(type) TRY(std::is_standard_layout<type>::value); \ | |
24 | TRY(std::is_standard_layout<type[]>::value); \ | |
4b2e63de | 25 | TRY(std::is_standard_layout<const volatile type>::value) |
c32097d8 JM |
26 | #define NO(type) TRY(!std::is_standard_layout<type>::value); \ |
27 | TRY(!std::is_standard_layout<type[]>::value); \ | |
4b2e63de | 28 | TRY(!std::is_standard_layout<const volatile type>::value) |
c32097d8 JM |
29 | #define NONPOD(type) TRY(!std::is_pod<type>::value); \ |
30 | TRY(!std::is_pod<type[]>::value); \ | |
4b2e63de | 31 | TRY(!std::is_pod<const volatile type>::value) |
c32097d8 JM |
32 | |
33 | struct A; | |
34 | ||
35 | YES(int); | |
36 | YES(__complex int); | |
37 | YES(void *); | |
38 | YES(int A::*); | |
39 | typedef int (A::*pmf)(); | |
40 | YES(pmf); | |
41 | ||
42 | struct A { ~A(); }; | |
43 | YES(A); | |
44 | NONPOD(A); | |
45 | struct F: public A { int i; }; | |
46 | YES(F); | |
47 | NONPOD(F); | |
48 | struct G: public A { A a; }; | |
49 | NO(G); | |
50 | struct M { A a; }; | |
51 | YES(M); | |
52 | ||
53 | class B | |
54 | { | |
55 | int i; | |
56 | __complex int c; | |
57 | void *p; | |
58 | double ar[4]; | |
59 | int A::* pm; | |
60 | int (A::*pmf)(); | |
61 | }; | |
62 | YES(B); | |
63 | struct D: public B { }; | |
64 | YES(D); | |
65 | struct E: public B { int q; }; | |
66 | NO(E); | |
67 | struct D2: public B { }; | |
68 | YES(D2); | |
69 | struct I: public D, public D2 { }; | |
70 | NO(I); | |
71 | ||
72 | struct C | |
73 | { | |
74 | int i; | |
75 | private: | |
76 | int j; | |
77 | }; | |
78 | NO(C); | |
79 | struct H: public C { }; | |
80 | NO(H); | |
81 | struct N { C c; }; | |
82 | NO(N); | |
83 | ||
84 | struct J { virtual void f(); }; | |
85 | struct J2: J { }; | |
86 | NO(J); | |
87 | NO(J2); | |
88 | struct K { }; | |
89 | struct L: virtual K {}; | |
90 | YES(K); | |
91 | NO(L); |