xref: /llvm-project/clang/test/AST/ByteCode/invalid.cpp (revision 0bc8168070677ef08d58864477d95ebdef917d0c)
1125aa10bSTimm Baeder // RUN: %clang_cc1 -fcxx-exceptions -std=c++20 -fexperimental-new-constant-interpreter -verify=expected,both %s
2125aa10bSTimm Baeder // RUN: %clang_cc1 -fcxx-exceptions -std=c++20 -verify=ref,both %s
3a07aba5dSTimm Baeder 
4a07aba5dSTimm Baeder namespace Throw {
5a07aba5dSTimm Baeder 
6a07aba5dSTimm Baeder   constexpr int ConditionalThrow(bool t) {
7a07aba5dSTimm Baeder     if (t)
875ef9558STimm Bäder       throw 4; // both-note {{subexpression not valid in a constant expression}}
9a07aba5dSTimm Baeder 
10a07aba5dSTimm Baeder     return 0;
11a07aba5dSTimm Baeder   }
12a07aba5dSTimm Baeder 
13a07aba5dSTimm Baeder   static_assert(ConditionalThrow(false) == 0, "");
1475ef9558STimm Bäder   static_assert(ConditionalThrow(true) == 0, ""); // both-error {{not an integral constant expression}} \
1575ef9558STimm Bäder                                                   // both-note {{in call to 'ConditionalThrow(true)'}}
16a07aba5dSTimm Baeder 
1775ef9558STimm Bäder   constexpr int Throw() { // both-error {{never produces a constant expression}}
1875ef9558STimm Bäder     throw 5; // both-note {{subexpression not valid in a constant expression}}
19a07aba5dSTimm Baeder     return 0;
20a07aba5dSTimm Baeder   }
21a07aba5dSTimm Baeder 
2275ef9558STimm Bäder   constexpr int NoSubExpr() { // both-error {{never produces a constant expression}}
2375ef9558STimm Bäder     throw; // both-note 2{{subexpression not valid}}
24a07aba5dSTimm Baeder     return 0;
25a07aba5dSTimm Baeder   }
2675ef9558STimm Bäder   static_assert(NoSubExpr() == 0, ""); // both-error {{not an integral constant expression}} \
2775ef9558STimm Bäder                                        // both-note {{in call to}}
28a07aba5dSTimm Baeder }
29a07aba5dSTimm Baeder 
30a07aba5dSTimm Baeder namespace Asm {
31a07aba5dSTimm Baeder   constexpr int ConditionalAsm(bool t) {
32a07aba5dSTimm Baeder     if (t)
3375ef9558STimm Bäder       asm(""); // both-note {{subexpression not valid in a constant expression}}
34a07aba5dSTimm Baeder 
35a07aba5dSTimm Baeder     return 0;
36a07aba5dSTimm Baeder   }
37a07aba5dSTimm Baeder   static_assert(ConditionalAsm(false) == 0, "");
3875ef9558STimm Bäder   static_assert(ConditionalAsm(true) == 0, ""); // both-error {{not an integral constant expression}} \
3975ef9558STimm Bäder                                                 // both-note {{in call to 'ConditionalAsm(true)'}}
40a07aba5dSTimm Baeder 
41a07aba5dSTimm Baeder 
4275ef9558STimm Bäder   constexpr int Asm() { // both-error {{never produces a constant expression}}
4375ef9558STimm Bäder     __asm volatile(""); // both-note {{subexpression not valid in a constant expression}}
44a07aba5dSTimm Baeder     return 0;
45a07aba5dSTimm Baeder   }
46a07aba5dSTimm Baeder }
47a07aba5dSTimm Baeder 
48a07aba5dSTimm Baeder namespace Casts {
4975ef9558STimm Bäder   constexpr int a = reinterpret_cast<int>(12); // both-error {{must be initialized by a constant expression}} \
5075ef9558STimm Bäder                                                // both-note {{reinterpret_cast is not allowed}}
51a07aba5dSTimm Baeder 
52125aa10bSTimm Baeder   void func() {
53125aa10bSTimm Baeder     struct B {};
54125aa10bSTimm Baeder     B b;
55125aa10bSTimm Baeder     (void)*reinterpret_cast<void*>(&b); // both-error {{indirection not permitted on operand of type 'void *'}}
56125aa10bSTimm Baeder   }
57*0bc81680STimm Baeder 
58*0bc81680STimm Baeder   /// Just make sure this doesn't crash.
59*0bc81680STimm Baeder   float PR9558 = reinterpret_cast<const float&>("asd");
60a07aba5dSTimm Baeder }
61