https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/93187
>From faecc5c3d88f2e205c62424e4c76df92f66ea4fe Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Thu, 23 May 2024 14:58:49 +0200 Subject: [PATCH 1/2] [Clang] Only check exprs that might be immediate escalating in evaluated contexts As per https://eel.is/c++draft/expr.const#17 Fixes #91308 --- clang/docs/ReleaseNotes.rst | 2 ++ clang/include/clang/Sema/Sema.h | 13 +++++++++++++ clang/lib/Sema/SemaTemplateDeduction.cpp | 5 +++++ clang/test/SemaCXX/cxx2b-consteval-propagate.cpp | 8 ++++++++ 4 files changed, 28 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 0c4a343b70009..55b963657a1d7 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 try 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>); +} >From 8352f4b50ef5d115af20f6af4eb2d339ed73b6da Mon Sep 17 00:00:00 2001 From: cor3ntin <corentinja...@gmail.com> Date: Thu, 23 May 2024 15:36:43 +0200 Subject: [PATCH 2/2] Update clang/docs/ReleaseNotes.rst Co-authored-by: Mariya Podchishchaeva <mariya.podchishcha...@intel.com> --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 55b963657a1d7..7bcdee96e213e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -769,7 +769,7 @@ 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 try to check if an expression is immediate-escalating in an unevaluated context. +- Clang no longer tries to check if an expression is immediate-escalating in an unevaluated context. Fixes (#GH91308). Bug Fixes to AST Handling _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits