xref: /aosp_15_r20/external/clang/test/SemaCXX/constexpr-value-init.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -Wno-uninitialized -std=c++11 -fsyntax-only -verify
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
AA4*67e74705SXin Li   constexpr A() : a(b + 1), b(a + 1) {} // expected-note {{outside its lifetime}}
5*67e74705SXin Li   int a;
6*67e74705SXin Li   int b;
7*67e74705SXin Li };
8*67e74705SXin Li struct B {
9*67e74705SXin Li   A a;
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li constexpr A a; // ok, zero initialization precedes static initialization
f()13*67e74705SXin Li void f() {
14*67e74705SXin Li   constexpr A a; // expected-error {{constant expression}} expected-note {{in call to 'A()'}}
15*67e74705SXin Li }
16*67e74705SXin Li 
17*67e74705SXin Li constexpr B b1; // ok
18*67e74705SXin Li constexpr B b2 = B(); // ok
19*67e74705SXin Li static_assert(b2.a.a == 1, "");
20*67e74705SXin Li static_assert(b2.a.b == 2, "");
21*67e74705SXin Li 
22*67e74705SXin Li struct C {
23*67e74705SXin Li   int c;
24*67e74705SXin Li };
25*67e74705SXin Li struct D : C { int d; };
26*67e74705SXin Li constexpr C c1; // expected-error {{without a user-provided default constructor}}
27*67e74705SXin Li constexpr C c2 = C(); // ok
28*67e74705SXin Li constexpr D d1; // expected-error {{without a user-provided default constructor}}
29*67e74705SXin Li constexpr D d2 = D(); // ok with DR1452
30*67e74705SXin Li static_assert(D().c == 0, "");
31*67e74705SXin Li static_assert(D().d == 0, "");
32*67e74705SXin Li 
33*67e74705SXin Li struct V : virtual C {};
34*67e74705SXin Li template<typename T> struct Z : T {
ZZ35*67e74705SXin Li   constexpr Z() : V() {}
36*67e74705SXin Li };
37*67e74705SXin Li constexpr int n = Z<V>().c; // expected-error {{constant expression}} expected-note {{virtual base class}}
38