// RUN: %clang_cc1 -std=c++2a -verify %s constinit int a; constinit thread_local int b; constinit static int c; void f() { constinit static int a; constinit thread_local int b; constinit int c; // expected-error {{local variable cannot be declared 'constinit'}} } namespace missing { int a; // expected-note {{add the 'constinit' specifier}} extern constinit int a; // expected-error {{added after initialization}} // We allow inheriting 'constinit' from a forward declaration as an extension. extern constinit int b; // expected-note {{here}} int b; // expected-warning {{'constinit' specifier missing}} } struct S { static constinit int a; // expected-note {{here}} static constinit constexpr int b; // expected-error {{cannot combine with previous}} expected-note {{here}} static constinit const int c = 1; static constinit const int d = 1; }; int S::a; // expected-warning {{'constinit' specifier missing}} int S::b; // expected-warning {{'constinit' specifier missing}} const int S::c; inline const int S::d; struct T { static int a; static constexpr int b = 1; // expected-note {{add the 'constinit' specifier}} static const int c = 1; // expected-note {{add the 'constinit' specifier}} static const int d = 1; // expected-note {{add the 'constinit' specifier}} }; constinit int T::a; constinit const int T::b; // expected-error {{'constinit' specifier added after initialization}} constinit const int T::c; // expected-error {{'constinit' specifier added after initialization}} constinit inline const int T::d; // expected-error {{'constinit' specifier added after initialization}} constinit void g() {} // expected-error {{constinit can only be used in variable declarations}} // (These used to trigger crashes.) void h(); constinit void h(); // expected-error {{constinit can only be used in variable declarations}} constexpr void i(); // expected-note {{here}} constinit void i(); // expected-error {{non-constexpr declaration of 'i' follows constexpr declaration}} // expected-error@-1 {{constinit can only be used in variable declarations}} typedef constinit int type; // expected-error {{typedef cannot be constinit}} using type = constinit int; // expected-error {{type name does not allow constinit specifier}} auto q() -> int constinit; // expected-error {{type name does not allow constinit specifier}}