brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · ad87b64 Raw
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