// 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;
}