xref: /llvm-project/clang/test/AST/ByteCode/if.cpp (revision acb7dfaa017dc11106bf97de4e8bf72d47ff54a8)
1a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++23 -fsyntax-only -fexperimental-new-constant-interpreter %s -verify=expected,both
2a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++23 -fsyntax-only %s -verify=ref,both
3a07aba5dSTimm Baeder 
4a07aba5dSTimm Baeder namespace ConstEval {
5a07aba5dSTimm Baeder   constexpr int f() {
6a07aba5dSTimm Baeder     int i = 0;
7a07aba5dSTimm Baeder     if consteval {
8a07aba5dSTimm Baeder       i = 1;
9a07aba5dSTimm Baeder     }
10a07aba5dSTimm Baeder     return i;
11a07aba5dSTimm Baeder   }
12a07aba5dSTimm Baeder   static_assert(f() == 1, "");
13a07aba5dSTimm Baeder 
14a07aba5dSTimm Baeder   constexpr int f2() {
15a07aba5dSTimm Baeder     int i = 0;
16a07aba5dSTimm Baeder     if !consteval {
17a07aba5dSTimm Baeder         i = 12;
18a07aba5dSTimm Baeder       if consteval {
19a07aba5dSTimm Baeder         i = i + 1;
20a07aba5dSTimm Baeder       }
21a07aba5dSTimm Baeder     }
22a07aba5dSTimm Baeder     return i;
23a07aba5dSTimm Baeder   }
24a07aba5dSTimm Baeder   static_assert(f2() == 0, "");
25a07aba5dSTimm Baeder };
26a07aba5dSTimm Baeder 
27a07aba5dSTimm Baeder namespace InitDecl {
28a07aba5dSTimm Baeder   constexpr bool f() {
29a07aba5dSTimm Baeder     if (int i = 5; i != 10) {
30a07aba5dSTimm Baeder       return true;
31a07aba5dSTimm Baeder     }
32a07aba5dSTimm Baeder     return false;
33a07aba5dSTimm Baeder   }
34a07aba5dSTimm Baeder   static_assert(f(), "");
35a07aba5dSTimm Baeder 
36a07aba5dSTimm Baeder   constexpr bool f2() {
37a07aba5dSTimm Baeder     if (bool b = false; b) {
38a07aba5dSTimm Baeder       return true;
39a07aba5dSTimm Baeder     }
40a07aba5dSTimm Baeder     return false;
41a07aba5dSTimm Baeder   }
42a07aba5dSTimm Baeder   static_assert(!f2(), "");
43a07aba5dSTimm Baeder 
44a07aba5dSTimm Baeder 
45a07aba5dSTimm Baeder   constexpr int attrs() {
46a07aba5dSTimm Baeder     if (1) [[likely]] {}
47a07aba5dSTimm Baeder     return 1;
48a07aba5dSTimm Baeder   }
49a07aba5dSTimm Baeder   static_assert(attrs() == 1, "");
50a07aba5dSTimm Baeder };
51a07aba5dSTimm Baeder 
52a07aba5dSTimm Baeder /// The faulty if statement creates a RecoveryExpr with contains-errors,
53a07aba5dSTimm Baeder /// but the execution will never reach that.
54a07aba5dSTimm Baeder constexpr char g(char const (&x)[2]) {
55a07aba5dSTimm Baeder     return 'x';
56a07aba5dSTimm Baeder   if (auto [a, b] = x) // both-error {{an array type is not allowed here}} \
57a07aba5dSTimm Baeder                        // both-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
58a07aba5dSTimm Baeder     ;
59a07aba5dSTimm Baeder }
60a07aba5dSTimm Baeder static_assert(g("x") == 'x');
61a07aba5dSTimm Baeder 
62a07aba5dSTimm Baeder namespace IfScope {
63a07aba5dSTimm Baeder   struct Inc {
64a07aba5dSTimm Baeder     int &a;
65a07aba5dSTimm Baeder     constexpr Inc(int &a) : a(a) {}
66a07aba5dSTimm Baeder     constexpr ~Inc() { ++a; }
67a07aba5dSTimm Baeder   };
68a07aba5dSTimm Baeder 
69a07aba5dSTimm Baeder   constexpr int foo() {
70a07aba5dSTimm Baeder     int a= 0;
71a07aba5dSTimm Baeder     int b = 12;
72a07aba5dSTimm Baeder     if (Inc{a}; true) {
73a07aba5dSTimm Baeder       b += a;
74a07aba5dSTimm Baeder     }
75a07aba5dSTimm Baeder     return b;
76a07aba5dSTimm Baeder   }
77a07aba5dSTimm Baeder   static_assert(foo() == 13, "");
78a07aba5dSTimm Baeder }
79*acb7dfaaSTimm Baeder 
80*acb7dfaaSTimm Baeder namespace IfScope2 {
81*acb7dfaaSTimm Baeder   struct __bit_iterator {
82*acb7dfaaSTimm Baeder     unsigned __ctz_;
83*acb7dfaaSTimm Baeder   };
84*acb7dfaaSTimm Baeder   constexpr void __fill_n_bool(__bit_iterator) {}
85*acb7dfaaSTimm Baeder 
86*acb7dfaaSTimm Baeder   constexpr void fill_n(__bit_iterator __first) {
87*acb7dfaaSTimm Baeder     if (false)
88*acb7dfaaSTimm Baeder       __fill_n_bool(__first);
89*acb7dfaaSTimm Baeder     else
90*acb7dfaaSTimm Baeder       __fill_n_bool(__first);
91*acb7dfaaSTimm Baeder   }
92*acb7dfaaSTimm Baeder 
93*acb7dfaaSTimm Baeder   struct bitset{
94*acb7dfaaSTimm Baeder     constexpr void reset() {
95*acb7dfaaSTimm Baeder       auto m = __bit_iterator(8);
96*acb7dfaaSTimm Baeder       fill_n(m);
97*acb7dfaaSTimm Baeder     }
98*acb7dfaaSTimm Baeder   };
99*acb7dfaaSTimm Baeder   consteval bool foo() {
100*acb7dfaaSTimm Baeder     bitset v;
101*acb7dfaaSTimm Baeder     v.reset();
102*acb7dfaaSTimm Baeder     return true;
103*acb7dfaaSTimm Baeder   }
104*acb7dfaaSTimm Baeder   static_assert(foo());
105*acb7dfaaSTimm Baeder }
106