llvm-project/clang/test/SemaCXX/cxx2b-consteval-if.cpp
Sam McCall 880fa7faa9 Revert "[clang][SemaCXX] Diagnose tautological uses of consteval if and is_constant_evaluated"
This reverts commit 491b2810fb7fe5f080fa9c4f5945ed0a6909dc92.

This change broke valid code and generated incorrect diagnostics, see
https://reviews.llvm.org/D155064
2023-09-27 18:58:01 +02:00

57 lines
1.4 KiB
C++

// RUN: %clang_cc1 -std=c++23 -verify %s
namespace PR52206 {
constexpr auto f() {
if consteval { return 0; }
if !consteval { return 0.0; } // expected-error {{'auto' in return type deduced as 'double' here but deduced as 'int' in earlier return statement}}
}
constexpr auto g() {
if !consteval { return 0; }
if consteval { return 0.0; } // expected-error {{'auto' in return type deduced as 'double' here but deduced as 'int' in earlier return statement}}
}
constexpr auto h() {
if consteval { return 0; }
if !consteval { return 0; } // okay
}
constexpr auto i() {
if consteval {
if consteval { // expected-warning {{consteval if is always true in an immediate context}}
return 1;
}
return 2;
} else {
return 1.0; // expected-error {{'auto' in return type deduced as 'double' here but deduced as 'int' in earlier return statement}}
}
}
void test() {
auto x1 = f();
constexpr auto y1 = f();
auto x2 = g();
constexpr auto y2 = g();
auto x3 = h();
constexpr auto y3 = h();
auto x4 = i();
constexpr auto y4 = i();
}
} // namespace PR52206
consteval int *make() { return new int; }
auto f() {
if constexpr (false) {
if consteval {
// Immediate function context, so call to `make()` is valid.
// Discarded statement context, so `return 0;` is valid too.
delete make();
return 0;
}
}
return 0.0;
}