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