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