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