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