xref: /llvm-project/clang/test/AST/ByteCode/constexpr-subobj-initialization.cpp (revision a07aba5d44204a7ca0d891a3da05af9960081e4c)
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