xref: /llvm-project/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp (revision f9a14782000e6aa2c4031bc97b20c351a9f281c3)
1 // RUN: %clang_cc1 -verify -std=c++23 -Wpre-c++23-compat %s
2 
h(int n)3 constexpr int h(int n) {
4   if (!n)
5     return 0;
6   static const int m = n; // expected-warning {{definition of a static variable in a constexpr function is incompatible with C++ standards before C++23}}
7   return m;
8 }
9 
i(int n)10 constexpr int i(int n) {
11   if (!n)
12     return 0;
13   thread_local const int m = n; // expected-warning {{definition of a thread_local variable in a constexpr function is incompatible with C++ standards before C++23}}
14   return m;
15 }
16 
g()17 constexpr int g() {
18   goto test; // expected-warning {{use of this statement in a constexpr function is incompatible with C++ standards before C++23}}
19 test:
20   return 0;
21 }
22 
h()23 constexpr void h() {
24 label:; // expected-warning {{use of this statement in a constexpr function is incompatible with C++ standards before C++23}}
25 }
26 
27 struct NonLiteral { // expected-note 2 {{'NonLiteral' is not literal}}
NonLiteralNonLiteral28   NonLiteral() {}
29 };
30 
non_literal()31 constexpr void non_literal() {
32   NonLiteral n; // expected-warning {{definition of a variable of non-literal type in a constexpr function is incompatible with C++ standards before C++23}}
33 }
34 
non_literal2(bool b)35 constexpr void non_literal2(bool b) {
36   if (!b)
37     NonLiteral n; // expected-warning {{definition of a variable of non-literal type in a constexpr function is incompatible with C++ standards before C++23}}
38 }
39 
c_thread_local(int n)40 constexpr int c_thread_local(int n) {
41   if (!n)
42     return 0;
43   static _Thread_local int a; // expected-warning {{definition of a static variable in a constexpr function is incompatible with C++ standards before C++23}}
44   _Thread_local int b;        // // expected-error {{'_Thread_local' variables must have global storage}}
45   return 0;
46 }
47 
gnu_thread_local(int n)48 constexpr int gnu_thread_local(int n) {
49   if (!n)
50     return 0;
51   static __thread int a; // expected-warning {{definition of a static variable in a constexpr function is incompatible with C++ standards before C++23}}
52   __thread int b;        // expected-error {{'__thread' variables must have global storage}}
53   return 0;
54 }
55