p6-0x.cpp revision 6180245e9f63d2927b185ec251fb75aba30f1cac
1// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 2 3// Implicitly-defined default constructors are constexpr if the implicit 4// definition would be. 5struct NonConstexpr1 { // expected-note {{here}} 6 int a; 7}; 8struct NonConstexpr2 { // expected-note {{here}} 9 NonConstexpr1 nl; 10}; 11constexpr NonConstexpr1 nc1 = NonConstexpr1(); // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr1'}} 12constexpr NonConstexpr2 nc2 = NonConstexpr2(); // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr2'}} 13 14struct Constexpr1 {}; 15constexpr Constexpr1 c1 = Constexpr1(); // ok 16struct NonConstexpr3 : virtual Constexpr1 {}; 17constexpr NonConstexpr3 nc3 = NonConstexpr3(); // expected-error {{constant expression}} expected-note {{non-literal type 'const NonConstexpr3'}} 18 19struct Constexpr2 { 20 int a = 0; 21}; 22constexpr Constexpr2 c2 = Constexpr2(); // ok 23 24int n; 25struct Member { 26 Member() : a(n) {} 27 constexpr Member(int&a) : a(a) {} 28 int &a; 29}; 30struct NonConstexpr4 { // expected-note {{here}} 31 Member m; 32}; 33constexpr NonConstexpr4 nc4 = NonConstexpr4(); // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr4'}} 34struct Constexpr3 { 35 constexpr Constexpr3() : m(n) {} 36 Member m; 37}; 38constexpr Constexpr3 c3 = Constexpr3(); // ok 39struct Constexpr4 { 40 Constexpr3 m; 41}; 42constexpr Constexpr4 c4 = Constexpr4(); // ok 43 44 45// This rule breaks some legal C++98 programs! 46struct A {}; // expected-note {{here}} 47struct B { 48 friend A::A(); // expected-error {{non-constexpr declaration of 'A' follows constexpr declaration}} 49}; 50