158 lines
3.8 KiB
C++
158 lines
3.8 KiB
C++
// RUN: %clang_cc1 -std=c++23 -verify %s
|
|
|
|
void test_consteval() {
|
|
if consteval ({(void)1;}); // expected-error {{expected { after consteval}}
|
|
if consteval (void) 0; // expected-error {{expected { after consteval}}
|
|
if consteval {
|
|
(void)0;
|
|
} else (void)0; // expected-error {{expected { after else}}
|
|
|
|
static_assert([] {
|
|
if consteval {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}() == 0);
|
|
|
|
static_assert([] {
|
|
if consteval {
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}() == 0);
|
|
|
|
static_assert([] {
|
|
if !consteval {
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}() == 1);
|
|
|
|
static_assert([] {
|
|
if not consteval {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}() == 1);
|
|
|
|
if consteval [[likely]] { // expected-warning {{attribute 'likely' has no effect when annotating an 'if consteval' statement}}\
|
|
// expected-note 2{{annotating the 'if consteval' statement here}}
|
|
|
|
|
|
}
|
|
else [[unlikely]] { // expected-warning {{attribute 'unlikely' has no effect when annotating an 'if consteval' statement}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void test_consteval_jumps() {
|
|
if consteval { // expected-note 4{{jump enters controlled statement of consteval if}}
|
|
goto a;
|
|
goto b; // expected-error {{cannot jump from this goto statement to its label}}
|
|
a:;
|
|
} else {
|
|
goto b;
|
|
goto a; // expected-error {{cannot jump from this goto statement to its label}}
|
|
b:;
|
|
}
|
|
goto a; // expected-error {{cannot jump from this goto statement to its label}}
|
|
goto b; // expected-error {{cannot jump from this goto statement to its label}}
|
|
}
|
|
|
|
void test_consteval_switch() {
|
|
int x = 42;
|
|
switch (x) {
|
|
if consteval { // expected-note 2{{jump enters controlled statement of consteval if}}
|
|
case 1:; // expected-error {{cannot jump from switch statement to this case label}}
|
|
default:; // expected-error {{cannot jump from switch statement to this case label}}
|
|
} else {
|
|
}
|
|
}
|
|
switch (x) {
|
|
if consteval { // expected-note 2{{jump enters controlled statement of consteval if}}
|
|
} else {
|
|
case 2:; // expected-error {{cannot jump from switch statement to this case label}}
|
|
default:; // expected-error {{cannot jump from switch statement to this case label}}
|
|
}
|
|
}
|
|
}
|
|
|
|
consteval int f(int i) { return i; }
|
|
constexpr int g(int i) {
|
|
if consteval {
|
|
return f(i);
|
|
} else {
|
|
return 42;
|
|
}
|
|
}
|
|
static_assert(g(10) == 10);
|
|
|
|
constexpr int h(int i) { // expected-note {{declared here}}
|
|
if !consteval {
|
|
return f(i); // expected-error {{call to consteval function 'f' is not a constant expression}}\
|
|
// expected-note {{cannot be used in a constant expression}}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
consteval void warn_in_consteval() {
|
|
if consteval { // expected-warning {{consteval if is always true in an immediate context}}
|
|
if consteval {} // expected-warning {{consteval if is always true in an immediate context}}
|
|
}
|
|
}
|
|
|
|
constexpr void warn_in_consteval2() {
|
|
if consteval {
|
|
if consteval {} // expected-warning {{consteval if is always true in an immediate context}}
|
|
}
|
|
}
|
|
|
|
auto y = []() consteval {
|
|
if consteval { // expected-warning {{consteval if is always true in an immediate context}}
|
|
if consteval {} // expected-warning {{consteval if is always true in an immediate context}}
|
|
}
|
|
};
|
|
|
|
namespace test_transform {
|
|
int f(auto n) {
|
|
if consteval {
|
|
n.foo; //expected-error {{no member named}}
|
|
}
|
|
else {
|
|
}
|
|
|
|
if !consteval {
|
|
n.foo; //expected-error {{no member named}}
|
|
}
|
|
else {
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
constexpr int g(auto n) {
|
|
if consteval {
|
|
}
|
|
else {
|
|
n.foo; //expected-error {{no member named}}
|
|
}
|
|
|
|
if !consteval {
|
|
}
|
|
else {
|
|
n.foo; //expected-error {{no member named}}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct S {};
|
|
void test() {
|
|
f(S{}); //expected-note {{in instantiation}}
|
|
g(S{}); //expected-note {{in instantiation}}
|
|
}
|
|
|
|
}
|