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,15 @@ bool isImmediateFunctionContext() const { return Context == ExpressionEvaluationContext::ImmediateFunctionContext || - InImmediateFunctionContext; + (Context == ExpressionEvaluationContext::DiscardedStatement && + InImmediateFunctionContext); } bool isDiscardedStatementContext() const { return Context == ExpressionEvaluationContext::DiscardedStatement || - InDiscardedStatement; + (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)); + } +} +} // namespace deduced_return_type_in_discareded_statement + #endif