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}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits