Author: cor3ntin Date: 2024-05-23T17:53:07+02:00 New Revision: dd32c3d36fbf21cf90d47ea83ad40ee959dd38d3
URL: https://github.com/llvm/llvm-project/commit/dd32c3d36fbf21cf90d47ea83ad40ee959dd38d3 DIFF: https://github.com/llvm/llvm-project/commit/dd32c3d36fbf21cf90d47ea83ad40ee959dd38d3.diff LOG: [Clang] Only check exprs that might be immediate escalating in evaluated contexts (#93187) As per https://eel.is/c++draft/expr.const#17 Fixes #91308 --------- Co-authored-by: Mariya Podchishchaeva <mariya.podchishcha...@intel.com> Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaTemplateDeduction.cpp clang/test/SemaCXX/cxx2b-consteval-propagate.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 0c4a343b70009..7bcdee96e213e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -769,6 +769,8 @@ Bug Fixes to C++ Support - Fixed a crash when trying to emit captures in a lambda call operator with an explicit object parameter that is called on a derived type of the lambda. Fixes (#GH87210), (GH89541). +- Clang no longer tries to check if an expression is immediate-escalating in an unevaluated context. + Fixes (#GH91308). Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 057ff61ccc644..8888bf3923823 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -5112,6 +5112,13 @@ class Sema final : public SemaBase { Context == ExpressionEvaluationContext::UnevaluatedList; } + bool isPotentiallyEvaluated() const { + return Context == ExpressionEvaluationContext::PotentiallyEvaluated || + Context == + ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed || + Context == ExpressionEvaluationContext::ConstantEvaluated; + } + bool isConstantEvaluated() const { return Context == ExpressionEvaluationContext::ConstantEvaluated || Context == ExpressionEvaluationContext::ImmediateFunctionContext; @@ -5146,6 +5153,12 @@ class Sema final : public SemaBase { return ExprEvalContexts.back(); }; + const ExpressionEvaluationContextRecord &parentEvaluationContext() const { + assert(ExprEvalContexts.size() >= 2 && + "Must be in an expression evaluation context"); + return ExprEvalContexts[ExprEvalContexts.size() - 2]; + }; + bool isBoundsAttrContext() const { return ExprEvalContexts.back().ExprContext == ExpressionEvaluationContextRecord::ExpressionKind:: diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 76f47e9cb2560..08a69d3cb2589 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -4788,8 +4788,13 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( DeduceReturnType(Specialization, Info.getLocation(), false)) return TemplateDeductionResult::MiscellaneousDeductionFailure; + // [C++26][expr.const]/p17 + // An expression or conversion is immediate-escalating if it is not initially + // in an immediate function context and it is [...] + // a potentially-evaluated id-expression that denotes an immediate function. if (IsAddressOfFunction && getLangOpts().CPlusPlus20 && Specialization->isImmediateEscalating() && + parentEvaluationContext().isPotentiallyEvaluated() && CheckIfFunctionSpecializationIsImmediate(Specialization, Info.getLocation())) return TemplateDeductionResult::MiscellaneousDeductionFailure; diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp index 07937deb66738..b70c02201ac3c 100644 --- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp +++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp @@ -446,3 +446,11 @@ int h(int x) { } #endif + + +namespace GH91308 { + constexpr void f(auto) { + static_assert(false); + } + using R1 = decltype(&f<int>); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits