diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -1324,12 +1324,12 @@ bool isImmediateFunctionContext() const { return Context == ExpressionEvaluationContext::ImmediateFunctionContext || - InImmediateFunctionContext; + (Context == ExpressionEvaluationContext::DiscardedStatement && InImmediateFunctionContext); } bool isDiscardedStatementContext() const { - return Context == ExpressionEvaluationContext::DiscardedStatement || - InDiscardedStatement; + return Context == ExpressionEvaluationContext::DiscardedStatement || + (Context == ExpressionEvaluationContext::ImmediateFunctionContext && InDiscardedStatement); } }; diff --git a/clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p2.cpp b/clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p2.cpp --- a/clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p2.cpp +++ b/clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p2.cpp @@ -159,4 +159,19 @@ surprise: {} } } + +namespace deduced_return_type_in_discareded_statement { + + template + auto a(const T& t) { + return t; + } + + void f() { + if constexpr (false) { + a(a(0)); + } + } +} + #endif