[clang] ce9eaf0 - Revert "[clang][Sema] Use original template pattern when declaring implicit deduction guides for nested template classes (#68379)"
Antonio Abbatangelo via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 16 19:21:28 PDT 2023
Author: Antonio Abbatangelo
Date: 2023-10-16T22:16:09-04:00
New Revision: ce9eaf0360d9f528ab061bcdbcf81c5b2155f098
URL: https://github.com/llvm/llvm-project/commit/ce9eaf0360d9f528ab061bcdbcf81c5b2155f098
DIFF: https://github.com/llvm/llvm-project/commit/ce9eaf0360d9f528ab061bcdbcf81c5b2155f098.diff
LOG: Revert "[clang][Sema] Use original template pattern when declaring implicit deduction guides for nested template classes (#68379)"
This reverts commit dd0fba11690f9fef304d5f48cde646e5eca8d3c0.
It fails on nested classes that have both an explicit deduction guide and
a constructor that has an argument of the same type as the class (i.e. a copy constructor).
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaTemplate.cpp
Removed:
clang/test/SemaTemplate/nested-implicit-deduction-guides.cpp
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3f83cd71e64cbce..99525b00239a4ca 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -516,11 +516,6 @@ Bug Fixes to C++ Support
rather than prefer the non-templated constructor as specified in
[standard.group]p3.
-- Fix a bug where implicit deduction guides are not correctly generated for nested template
- classes. Fixes:
- (`#46200 <https://github.com/llvm/llvm-project/issues/46200>`_)
- (`#57812 <https://github.com/llvm/llvm-project/issues/57812>`_)
-
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
- Fixed an import failure of recursive friend class template.
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index fba5b2213917065..ff370dd1e080b2b 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -2250,7 +2250,6 @@ struct ConvertConstructorToDeductionGuideTransform {
Sema &SemaRef;
ClassTemplateDecl *Template;
- ClassTemplateDecl *NestedPattern = nullptr;
DeclContext *DC = Template->getDeclContext();
CXXRecordDecl *Primary = Template->getTemplatedDecl();
@@ -2328,8 +2327,6 @@ struct ConvertConstructorToDeductionGuideTransform {
if (FTD) {
Args.addOuterTemplateArguments(SubstArgs);
Args.addOuterRetainedLevel();
- if (NestedPattern)
- Args.addOuterRetainedLevels(NestedPattern->getTemplateDepth());
}
FunctionProtoTypeLoc FPTL = CD->getTypeSourceInfo()->getTypeLoc()
@@ -2441,17 +2438,10 @@ struct ConvertConstructorToDeductionGuideTransform {
SmallVector<QualType, 4> ParamTypes;
const FunctionProtoType *T = TL.getTypePtr();
- MultiLevelTemplateArgumentList OuterInstantiationArgs;
- if (NestedPattern)
- OuterInstantiationArgs = SemaRef.getTemplateInstantiationArgs(Template);
-
// -- The types of the function parameters are those of the constructor.
for (auto *OldParam : TL.getParams()) {
ParmVarDecl *NewParam =
transformFunctionTypeParam(OldParam, Args, MaterializedTypedefs);
- if (NestedPattern && NewParam)
- NewParam = transformFunctionTypeParam(NewParam, OuterInstantiationArgs,
- MaterializedTypedefs);
if (!NewParam)
return QualType();
ParamTypes.push_back(NewParam->getType());
@@ -2657,23 +2647,13 @@ void Sema::DeclareImplicitDeductionGuides(TemplateDecl *Template,
if (BuildingDeductionGuides.isInvalid())
return;
- // If the template is nested, then we need to use the original
- // pattern to iterate over the constructors.
- ClassTemplateDecl *Pattern = Transform.Template;
- while (Pattern->getInstantiatedFromMemberTemplate()) {
- if (Pattern->isMemberSpecialization())
- break;
- Pattern = Pattern->getInstantiatedFromMemberTemplate();
- Transform.NestedPattern = Pattern;
- }
-
// Convert declared constructors into deduction guide templates.
// FIXME: Skip constructors for which deduction must necessarily fail (those
// for which some class template parameter without a default argument never
// appears in a deduced context).
llvm::SmallPtrSet<NamedDecl *, 8> ProcessedCtors;
bool AddedAny = false;
- for (NamedDecl *D : LookupConstructors(Pattern->getTemplatedDecl())) {
+ for (NamedDecl *D : LookupConstructors(Transform.Primary)) {
D = D->getUnderlyingDecl();
if (D->isInvalidDecl() || D->isImplicit())
continue;
diff --git a/clang/test/SemaTemplate/nested-implicit-deduction-guides.cpp b/clang/test/SemaTemplate/nested-implicit-deduction-guides.cpp
deleted file mode 100644
index 4915c687cf4c4ef..000000000000000
--- a/clang/test/SemaTemplate/nested-implicit-deduction-guides.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-// RUN: %clang_cc1 -std=c++17 -verify %s
-// expected-no-diagnostics
-
-template<class T> struct S {
- template<class U> struct N {
- N(T) {}
- N(T, U) {}
- template<class V> N(V, U) {}
- };
-};
-
-S<int>::N x{"a", 1};
More information about the cfe-commits
mailing list