annotate gcc/testsuite/g++.dg/cpp0x/std-layout1.C @ 131:84e7813d76e9

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