16180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
26180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
36180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// Implicitly-defined default constructors are constexpr if the implicit
46180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// definition would be.
56180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct NonConstexpr1 { // expected-note {{here}}
66180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int a;
76180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
86180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct NonConstexpr2 { // expected-note {{here}}
96180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  NonConstexpr1 nl;
106180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
1151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithstruct NonConstexpr2a : NonConstexpr1 { };
1251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithconstexpr NonConstexpr1 nc1 = NonConstexpr1(); // ok, does not call constructor
1351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithconstexpr NonConstexpr2 nc2 = NonConstexpr2(); // ok, does not call constructor
1486c3ae46250cdcc57778c27826060779a92f3815Richard Smithconstexpr NonConstexpr2a nc2a = NonConstexpr2a(); // ok, does not call constructor
1551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithconstexpr int nc2_a = NonConstexpr2().nl.a; // ok
1651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithconstexpr int nc2a_a = NonConstexpr2a().a; // ok
1751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithstruct Helper {
1851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  friend constexpr NonConstexpr1::NonConstexpr1(); // expected-error {{follows non-constexpr declaration}}
1951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  friend constexpr NonConstexpr2::NonConstexpr2(); // expected-error {{follows non-constexpr declaration}}
2051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith};
216180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
226180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr1 {};
236180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr1 c1 = Constexpr1(); // ok
2486c3ae46250cdcc57778c27826060779a92f3815Richard Smithstruct NonConstexpr3 : virtual Constexpr1 {}; // expected-note {{struct with virtual base}} expected-note {{declared here}}
2586c3ae46250cdcc57778c27826060779a92f3815Richard Smithconstexpr NonConstexpr3 nc3 = NonConstexpr3(); // expected-error {{non-literal type 'const NonConstexpr3'}}
266180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
276180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr2 {
286180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int a = 0;
296180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
306180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr2 c2 = Constexpr2(); // ok
316180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
326180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithint n;
336180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Member {
346180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Member() : a(n) {}
356180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr Member(int&a) : a(a) {}
366180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int &a;
376180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
386180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct NonConstexpr4 { // expected-note {{here}}
396180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Member m;
406180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
416180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr NonConstexpr4 nc4 = NonConstexpr4(); // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr4'}}
426180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr3 {
436180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr Constexpr3() : m(n) {}
446180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Member m;
456180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
466180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr3 c3 = Constexpr3(); // ok
476180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr4 {
486180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Constexpr3 m;
496180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr4 c4 = Constexpr4(); // ok
516180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
526180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
536180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// This rule breaks some legal C++98 programs!
546180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct A {}; // expected-note {{here}}
556180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct B {
566180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  friend A::A(); // expected-error {{non-constexpr declaration of 'A' follows constexpr declaration}}
576180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
58d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith
59d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smithnamespace UnionCtors {
60d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  union A { // expected-note {{here}}
61d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int a;
62d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int b;
63d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
64d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  union B {
65d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int a;
66d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int b = 5;
67d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
68d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  union C {
69d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int a = 5;
70d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    int b;
71d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
72d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  struct D {
73d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    union {
74d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int a = 5;
75d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int b;
76d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    };
77d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    union {
78d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int c;
79d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int d = 5;
80d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    };
81d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
82d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  struct E { // expected-note {{here}}
83d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    union {
84d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int a;
85d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      int b;
86d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    };
87d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
88d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith
89d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  struct Test {
90d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    friend constexpr A::A() noexcept; // expected-error {{follows non-constexpr declaration}}
91d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    friend constexpr B::B() noexcept;
92d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    friend constexpr C::C() noexcept;
93d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    friend constexpr D::D() noexcept;
94d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith    friend constexpr E::E() noexcept; // expected-error {{follows non-constexpr declaration}}
95d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith  };
96d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith}
97