[clang] 9f3e340 - [clang]Transform uninstantiated ExceptionSpec in TemplateInstantiator (#68878)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 24 09:01:27 PDT 2023
Author: Congcong Cai
Date: 2023-10-25T00:01:22+08:00
New Revision: 9f3e3405603177c46b873fa219624b759e6ef851
URL: https://github.com/llvm/llvm-project/commit/9f3e3405603177c46b873fa219624b759e6ef851
DIFF: https://github.com/llvm/llvm-project/commit/9f3e3405603177c46b873fa219624b759e6ef851.diff
LOG: [clang]Transform uninstantiated ExceptionSpec in TemplateInstantiator (#68878)
Fixes #68543, #42496
Added:
clang/test/SemaCXX/dependent-noexcept-uninstantiated.cpp
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaTemplateDeduction.cpp
clang/lib/Sema/SemaTemplateInstantiate.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 06e083391da41d6..cf3f0c343b4d014 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -474,6 +474,10 @@ 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 for template functions
+ of template classes. 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
``shift count >= width of type`` or internal compiler error.
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 8f115f2177846b1..0b3f0247ea3bee3 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, nullptr, /*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 effc97a033c5eee..e09897318ba9883 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -1335,6 +1335,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,
@@ -1617,6 +1622,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) {
@@ -2684,8 +2701,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>;
More information about the cfe-commits
mailing list