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