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