1*a07aba5dSTimm Baeder // RUN: %clang_cc1 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter 2*a07aba5dSTimm Baeder 3*a07aba5dSTimm Baeder /// This is like the version in test/SemaCXX/, but some of the 4*a07aba5dSTimm Baeder /// output types and their location has been adapted. 5*a07aba5dSTimm Baeder /// Differences: 6*a07aba5dSTimm Baeder /// 1) The type of the uninitialized base class is printed WITH the namespace, 7*a07aba5dSTimm Baeder /// i.e. 'baseclass_uninit::DelBase' instead of just 'DelBase'. 8*a07aba5dSTimm Baeder 9*a07aba5dSTimm Baeder 10*a07aba5dSTimm Baeder namespace baseclass_uninit { 11*a07aba5dSTimm Baeder struct DelBase { 12*a07aba5dSTimm Baeder constexpr DelBase() = delete; // expected-note {{'DelBase' has been explicitly marked deleted here}} 13*a07aba5dSTimm Baeder }; 14*a07aba5dSTimm Baeder 15*a07aba5dSTimm Baeder struct Foo : DelBase { // expected-note 2{{constructor of base class 'baseclass_uninit::DelBase' is not called}} 16*a07aba5dSTimm Baeder constexpr Foo() {}; // expected-error {{call to deleted constructor of 'DelBase'}} 17*a07aba5dSTimm Baeder }; 18*a07aba5dSTimm Baeder constexpr Foo f; // expected-error {{must be initialized by a constant expression}} 19*a07aba5dSTimm Baeder 20*a07aba5dSTimm Baeder struct Bar : Foo { 21*a07aba5dSTimm Baeder constexpr Bar() {}; 22*a07aba5dSTimm Baeder }; 23*a07aba5dSTimm Baeder constexpr Bar bar; // expected-error {{must be initialized by a constant expression}} 24*a07aba5dSTimm Baeder 25*a07aba5dSTimm Baeder struct Base {}; 26*a07aba5dSTimm Baeder struct A : Base { // expected-note {{constructor of base class 'baseclass_uninit::Base' is not called}} 27*a07aba5dSTimm Baeder constexpr A() : value() {} // expected-error {{member initializer 'value' does not name a non-static data member or base class}} 28*a07aba5dSTimm Baeder }; 29*a07aba5dSTimm Baeder 30*a07aba5dSTimm Baeder constexpr A a; // expected-error {{must be initialized by a constant expression}} 31*a07aba5dSTimm Baeder 32*a07aba5dSTimm Baeder 33*a07aba5dSTimm Baeder struct B : Base { // expected-note {{constructor of base class 'baseclass_uninit::Base' is not called}} 34*a07aba5dSTimm Baeder constexpr B() : {} // expected-error {{expected class member or base class name}} 35*a07aba5dSTimm Baeder }; 36*a07aba5dSTimm Baeder 37*a07aba5dSTimm Baeder constexpr B b; // expected-error {{must be initialized by a constant expression}} 38*a07aba5dSTimm Baeder } // namespace baseclass_uninit 39*a07aba5dSTimm Baeder 40*a07aba5dSTimm Baeder 41*a07aba5dSTimm Baeder struct Foo { 42*a07aba5dSTimm Baeder constexpr Foo(); // expected-note 2{{declared here}} 43*a07aba5dSTimm Baeder }; 44*a07aba5dSTimm Baeder 45*a07aba5dSTimm Baeder constexpr Foo ff; // expected-error {{must be initialized by a constant expression}} \ 46*a07aba5dSTimm Baeder // expected-note {{undefined constructor 'Foo' cannot be used in a constant expression}} 47*a07aba5dSTimm Baeder 48*a07aba5dSTimm Baeder struct Bar : protected Foo { 49*a07aba5dSTimm Baeder int i; 50*a07aba5dSTimm Baeder constexpr Bar() : i(12) {} // expected-note {{undefined constructor 'Foo' cannot be used in a constant expression}} 51*a07aba5dSTimm Baeder }; 52*a07aba5dSTimm Baeder 53*a07aba5dSTimm Baeder constexpr Bar bb; // expected-error {{must be initialized by a constant expression}} \ 54*a07aba5dSTimm Baeder // expected-note {{in call to 'Bar()'}} 55*a07aba5dSTimm Baeder 56*a07aba5dSTimm Baeder template <typename Ty> 57*a07aba5dSTimm Baeder struct Baz { 58*a07aba5dSTimm Baeder constexpr Baz(); // expected-note {{declared here}} 59*a07aba5dSTimm Baeder }; 60*a07aba5dSTimm Baeder 61*a07aba5dSTimm Baeder struct Quux : Baz<Foo>, private Bar { 62*a07aba5dSTimm Baeder int i; 63*a07aba5dSTimm Baeder constexpr Quux() : i(12) {} // expected-note {{undefined constructor 'Baz' cannot be used in a constant expression}} 64*a07aba5dSTimm Baeder }; 65*a07aba5dSTimm Baeder 66*a07aba5dSTimm Baeder constexpr Quux qx; // expected-error {{must be initialized by a constant expression}} \ 67*a07aba5dSTimm Baeder // expected-note {{in call to 'Quux()'}} 68