brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 8d43be6 Raw
159 lines · cpp
1// RUN: %clang_cc1 -std=c++23 -verify %s2 3void test_consteval() {4  if consteval ({(void)1;});  // expected-error {{expected { after consteval}}5  if consteval (void) 0; // expected-error {{expected { after consteval}}6  if consteval {7    (void)0;8  } else (void)0; // expected-error {{expected { after else}}9 10  static_assert([] {11    if consteval {12      return 0;13    }14    return 1;15  }() == 0);16 17  static_assert([] {18    if consteval {19      return 0;20    } else {21      return 1;22    }23  }() == 0);24 25  static_assert([] {26    if !consteval {27      return 0;28    } else {29      return 1;30    }31  }() == 1);32 33  static_assert([] {34    if not consteval {35      return 0;36    }37    return 1;38  }() == 1);39 40  if consteval [[likely]] { // expected-warning {{attribute 'likely' has no effect when annotating an 'if consteval' statement}}\41                            // expected-note 2{{annotating the 'if consteval' statement here}}42 43 44  }45  else [[unlikely]] { // expected-warning {{attribute 'unlikely' has no effect when annotating an 'if consteval' statement}}46 47  }48 49}50 51void test_consteval_jumps() {52  if consteval { // expected-note 4{{jump enters controlled statement of consteval if}}53    goto a;54    goto b; // expected-error {{cannot jump from this goto statement to its label}}55  a:;56  } else {57    goto b;58    goto a; // expected-error {{cannot jump from this goto statement to its label}}59  b:;60  }61  goto a; // expected-error {{cannot jump from this goto statement to its label}}62  goto b; // expected-error {{cannot jump from this goto statement to its label}}63}64 65void test_consteval_switch() {66  int x = 42;67  switch (x) {68    if consteval { // expected-note 2{{jump enters controlled statement of consteval if}}69    case 1:;       // expected-error {{cannot jump from switch statement to this case label}}70    default:;      // expected-error {{cannot jump from switch statement to this case label}}71    } else {72    }73  }74  switch (x) {75    if consteval { // expected-note 2{{jump enters controlled statement of consteval if}}76    } else {77    case 2:;  // expected-error {{cannot jump from switch statement to this case label}}78    default:; // expected-error {{cannot jump from switch statement to this case label}}79    }80  }81}82 83consteval int f(int i) { return i; }84constexpr int g(int i) {85  if consteval {86    return f(i);87  } else {88    return 42;89  }90}91static_assert(g(10) == 10);92 93constexpr int h(int i) { // expected-note {{declared here}}94  if !consteval {95    return f(i); // expected-error {{call to consteval function 'f' is not a constant expression}}\96                     // expected-note  {{cannot be used in a constant expression}}97  }98  return 0;99}100 101consteval void warn_in_consteval() {102  if consteval { // expected-warning {{consteval if is always true in an immediate context}}103    if consteval {} // expected-warning {{consteval if is always true in an immediate context}}104  }105}106 107constexpr void warn_in_consteval2() {108  if consteval {109    if consteval {} // expected-warning {{consteval if is always true in an immediate context}}110  }111}112 113auto y = []() consteval {114  if consteval { // expected-warning {{consteval if is always true in an immediate context}}115    if consteval {} // expected-warning {{consteval if is always true in an immediate context}}116  }117};118 119namespace test_transform {120int f(auto n) {121  if consteval {122    n.foo; //expected-error {{no member named}}123  }124  else {125  }126 127  if !consteval {128    n.foo; //expected-error {{no member named}}129  }130  else {131  }132 133  return 0;134}135 136constexpr int g(auto n) {137  if consteval {138  }139  else {140    n.foo; //expected-error {{no member named}}141  }142 143  if !consteval {144  }145  else {146     n.foo; //expected-error {{no member named}}147  }148 149  return 0;150}151 152struct S {};153void test() {154  f(S{}); //expected-note {{in instantiation}}155  g(S{}); //expected-note {{in instantiation}}156}157 158}159