// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fexperimental-new-constant-interpreter %s -verify=expected,both // RUN: %clang_cc1 -std=c++23 -fsyntax-only %s -verify=ref,both namespace ConstEval { constexpr int f() { int i = 0; if consteval { i = 1; } return i; } static_assert(f() == 1, ""); constexpr int f2() { int i = 0; if !consteval { i = 12; if consteval { i = i + 1; } } return i; } static_assert(f2() == 0, ""); }; namespace InitDecl { constexpr bool f() { if (int i = 5; i != 10) { return true; } return false; } static_assert(f(), ""); constexpr bool f2() { if (bool b = false; b) { return true; } return false; } static_assert(!f2(), ""); constexpr int attrs() { if (1) [[likely]] {} return 1; } static_assert(attrs() == 1, ""); }; /// The faulty if statement creates a RecoveryExpr with contains-errors, /// but the execution will never reach that. constexpr char g(char const (&x)[2]) { return 'x'; if (auto [a, b] = x) // both-error {{an array type is not allowed here}} \ // both-warning {{structured binding declaration in a condition is a C++2c extension}} ; } static_assert(g("x") == 'x'); namespace IfScope { struct Inc { int &a; constexpr Inc(int &a) : a(a) {} constexpr ~Inc() { ++a; } }; constexpr int foo() { int a= 0; int b = 12; if (Inc{a}; true) { b += a; } return b; } static_assert(foo() == 13, ""); } namespace IfScope2 { struct __bit_iterator { unsigned __ctz_; }; constexpr void __fill_n_bool(__bit_iterator) {} constexpr void fill_n(__bit_iterator __first) { if (false) __fill_n_bool(__first); else __fill_n_bool(__first); } struct bitset{ constexpr void reset() { auto m = __bit_iterator(8); fill_n(m); } }; consteval bool foo() { bitset v; v.reset(); return true; } static_assert(foo()); }