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};
58