// RUN: %clang_cc1 -verify -std=c++2a -pedantic-errors %s // RUN: cp %s %t // RUN: not %clang_cc1 -x c++ -std=c++2a -fixit %t // RUN: %clang_cc1 -Wall -pedantic-errors -x c++ -std=c++2a %t // RUN: cat %t | FileCheck %s /* This is a test of the various code modification hints that only apply in C++2a. */ template void init_capture_pack(T ...a) { [x... = a]{}; // expected-error {{must appear before the name}} [x = a...]{}; // expected-error {{must appear before the name}} [...&x = a]{}; // expected-error {{must appear before the name}} [...a]{}; // expected-error {{must appear after the name}} [&...a]{}; // expected-error {{must appear after the name}} [...&a]{}; // expected-error {{must appear after the name}} } namespace constinit_mismatch { extern thread_local constinit int a; // expected-note {{declared constinit here}} thread_local int a = 123; // expected-error {{'constinit' specifier missing on initializing declaration of 'a'}} // CHECK: {{^}} constinit thread_local int a = 123; int b = 123; // expected-note {{add the 'constinit' specifier}} extern constinit int b; // expected-error {{'constinit' specifier added after initialization of variable}} // CHECK: {{^}} extern int b; template struct X { template static constinit int n; // expected-note {{constinit}} }; template template int X::n = 123; // expected-error {{missing}} // CHECK: {{^}} constinit int X::n = 123; #define ABSL_CONST_INIT [[clang::require_constant_initialization]] extern constinit int c; // expected-note {{constinit}} int c; // expected-error {{missing}} // CHECK: {{^}} ABSL_CONST_INIT int c; #define MY_CONST_INIT constinit extern constinit int d; // expected-note {{constinit}} int d; // expected-error {{missing}} // CHECK: {{^}} MY_CONST_INIT int d; #undef MY_CONST_INIT extern constinit int e; // expected-note {{constinit}} int e; // expected-error {{missing}} // CHECK: {{^}} ABSL_CONST_INIT int e; #undef ABSL_CONST_INIT }