https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/68878
>From b93096929aa98e17dfdb0240a9285d315fc95bfc Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Thu, 12 Oct 2023 19:31:08 +0800 Subject: [PATCH 1/2] [clang]Transform uninstantiated ExceptionSpec in TemplateInstantiator Fixes #68543, #42496 --- clang/docs/ReleaseNotes.rst | 2 ++ clang/lib/Sema/SemaTemplateDeduction.cpp | 9 ++++++++- clang/lib/Sema/SemaTemplateInstantiate.cpp | 19 +++++++++++++++++-- .../dependent-noexcept-uninstantiated.cpp | 11 +++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 clang/test/SemaCXX/dependent-noexcept-uninstantiated.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 2d918967e7f0b02..d3612db7957391d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -377,6 +377,8 @@ Bug Fixes in This Version cannot be used with ``Release`` mode builds. (`#68237 <https://github.com/llvm/llvm-project/issues/68237>`_). - Fix crash in evaluating ``constexpr`` value for invalid template function. Fixes (`#68542 <https://github.com/llvm/llvm-project/issues/68542>`_) +- Clang will correctly evaluate ``noexcept`` expression with template in template + method of template record. - Fixed an issue when a shift count larger than ``__INT64_MAX__``, in a right shift operation, could result in missing warnings about diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 62fbd903a04044b..2883e650b1ebd94 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -3367,7 +3367,14 @@ Sema::TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( SmallVector<QualType, 4> ExceptionStorage; if (getLangOpts().CPlusPlus17 && SubstExceptionSpec(Function->getLocation(), EPI.ExceptionSpec, - ExceptionStorage, MLTAL)) + ExceptionStorage, + getTemplateInstantiationArgs( + FunctionTemplate, /*Final=*/true, + /*Innermost=*/SugaredExplicitArgumentList, + /*RelativeToPrimary=*/false, + /*Pattern=*/nullptr, + /*ForConstraintInstantiation=*/false, + /*SkipForSpecialization=*/true))) return TDK_SubstitutionFailure; *FunctionType = BuildFunctionType(ResultType, ParamTypes, diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 23de64080a070ca..f28768931cfabf4 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1325,6 +1325,11 @@ namespace { /// declaration. NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc); + bool TransformExceptionSpec(SourceLocation Loc, + FunctionProtoType::ExceptionSpecInfo &ESI, + SmallVectorImpl<QualType> &Exceptions, + bool &Changed); + /// Rebuild the exception declaration and register the declaration /// as an instantiated local. VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, @@ -1607,6 +1612,18 @@ Decl *TemplateInstantiator::TransformDefinition(SourceLocation Loc, Decl *D) { return Inst; } +bool TemplateInstantiator::TransformExceptionSpec( + SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, + SmallVectorImpl<QualType> &Exceptions, bool &Changed) { + if (ESI.Type == EST_Uninstantiated) { + ESI.NoexceptExpr = cast<FunctionProtoType>(ESI.SourceTemplate->getType()) + ->getNoexceptExpr(); + ESI.Type = EST_DependentNoexcept; + Changed = true; + } + return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed); +} + NamedDecl * TemplateInstantiator::TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { @@ -2672,8 +2689,6 @@ bool Sema::SubstExceptionSpec(SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, SmallVectorImpl<QualType> &ExceptionStorage, const MultiLevelTemplateArgumentList &Args) { - assert(ESI.Type != EST_Uninstantiated); - bool Changed = false; TemplateInstantiator Instantiator(*this, Args, Loc, DeclarationName()); return Instantiator.TransformExceptionSpec(Loc, ESI, ExceptionStorage, diff --git a/clang/test/SemaCXX/dependent-noexcept-uninstantiated.cpp b/clang/test/SemaCXX/dependent-noexcept-uninstantiated.cpp new file mode 100644 index 000000000000000..ddb269890227539 --- /dev/null +++ b/clang/test/SemaCXX/dependent-noexcept-uninstantiated.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++17 %s +// expected-no-diagnostics + +using A = int; +using B = char; + +template <class T> struct C { + template <class V> void f0() noexcept(sizeof(T) == sizeof(A) && sizeof(V) == sizeof(B)) {} +}; + +void (C<int>::*tmp1)() noexcept = &C<A>::f0<B>; >From a8ab9a4b6fed480398133438ddf778343d77117b Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Fri, 13 Oct 2023 10:22:05 +0800 Subject: [PATCH 2/2] update release note --- clang/docs/ReleaseNotes.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index d3612db7957391d..3c6307ef2a4d430 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -378,7 +378,9 @@ Bug Fixes in This Version - Fix crash in evaluating ``constexpr`` value for invalid template function. Fixes (`#68542 <https://github.com/llvm/llvm-project/issues/68542>`_) - Clang will correctly evaluate ``noexcept`` expression with template in template - method of template record. + method of template record. Fixes + (`#68543 <https://github.com/llvm/llvm-project/issues/68543>`_, + `#42496 <https://github.com/llvm/llvm-project/issues/42496>`_) - Fixed an issue when a shift count larger than ``__INT64_MAX__``, in a right shift operation, could result in missing warnings about _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits