| 1 | // RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 2 | // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 3 | // RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 4 | // RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 5 | |
| 6 | #if __cplusplus < 201103L |
| 7 | // expected-error@+1 {{variadic macro}} |
| 8 | #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) |
| 9 | #endif |
| 10 | |
| 11 | namespace dr1813 { // dr1813: 7 |
| 12 | struct B { int i; }; |
| 13 | struct C : B {}; |
| 14 | struct D : C {}; |
| 15 | struct E : D { char : 4; }; |
| 16 | |
| 17 | static_assert(__is_standard_layout(B), ""); |
| 18 | static_assert(__is_standard_layout(C), ""); |
| 19 | static_assert(__is_standard_layout(D), ""); |
| 20 | static_assert(!__is_standard_layout(E), ""); |
| 21 | |
| 22 | struct Q {}; |
| 23 | struct S : Q {}; |
| 24 | struct T : Q {}; |
| 25 | struct U : S, T {}; |
| 26 | |
| 27 | static_assert(__is_standard_layout(Q), ""); |
| 28 | static_assert(__is_standard_layout(S), ""); |
| 29 | static_assert(__is_standard_layout(T), ""); |
| 30 | static_assert(!__is_standard_layout(U), ""); |
| 31 | } |
| 32 | |
| 33 | namespace dr1815 { // dr1815: no |
| 34 | #if __cplusplus >= 201402L |
| 35 | // FIXME: needs codegen test |
| 36 | struct A { int &&r = 0; }; // expected-note {{default member init}} |
| 37 | A a = {}; // FIXME expected-warning {{not supported}} |
| 38 | |
| 39 | struct B { int &&r = 0; }; // expected-error {{binds to a temporary}} expected-note {{default member init}} |
| 40 | B b; // expected-note {{here}} |
| 41 | #endif |
| 42 | } |
| 43 | |
| 44 | namespace dr1881 { // dr1881: 7 |
| 45 | struct A { int a : 4; }; |
| 46 | struct B : A { int b : 3; }; |
| 47 | static_assert(__is_standard_layout(A), ""); |
| 48 | static_assert(!__is_standard_layout(B), ""); |
| 49 | |
| 50 | struct C { int : 0; }; |
| 51 | struct D : C { int : 0; }; |
| 52 | static_assert(__is_standard_layout(C), ""); |
| 53 | static_assert(!__is_standard_layout(D), ""); |
| 54 | } |
| 55 | |
| 56 | void dr1891() { // dr1891: 4 |
| 57 | #if __cplusplus >= 201103L |
| 58 | int n; |
| 59 | auto a = []{}; // expected-note 2{{candidate}} expected-note 2{{here}} |
| 60 | auto b = [=]{ return n; }; // expected-note 2{{candidate}} expected-note 2{{here}} |
| 61 | typedef decltype(a) A; |
| 62 | typedef decltype(b) B; |
| 63 | |
| 64 | static_assert(!__has_trivial_constructor(A), ""); |
| 65 | static_assert(!__has_trivial_constructor(B), ""); |
| 66 | |
| 67 | A x; // expected-error {{no matching constructor}} |
| 68 | B y; // expected-error {{no matching constructor}} |
| 69 | |
| 70 | a = a; // expected-error {{copy assignment operator is implicitly deleted}} |
| 71 | a = static_cast<A&&>(a); // expected-error {{copy assignment operator is implicitly deleted}} |
| 72 | b = b; // expected-error {{copy assignment operator is implicitly deleted}} |
| 73 | b = static_cast<B&&>(b); // expected-error {{copy assignment operator is implicitly deleted}} |
| 74 | #endif |
| 75 | } |
| 76 | |