llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Younan Zhang (zyn0217) <details> <summary>Changes</summary> There were some cases where we computed incorrect template parameter depths for synthesized CTAD, invalid as they might be, we still shouldn't crash anyway. Technically the only scenario in which the inner function template's depth is 0 is when it lives within an explicit template specialization, where the template parameter list is empty. Fixes https://github.com/llvm/llvm-project/issues/128691 --- Full diff: https://github.com/llvm/llvm-project/pull/128704.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaTemplateDeductionGuide.cpp (+5-1) - (modified) clang/test/SemaTemplate/deduction-guide.cpp (+32) ``````````diff diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp index b789824d97020..0632defbd844f 100644 --- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp +++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp @@ -377,8 +377,12 @@ struct ConvertConstructorToDeductionGuideTransform { if (NestedPattern) Args.addOuterRetainedLevels(NestedPattern->getTemplateDepth()); auto [Depth, Index] = getDepthAndIndex(Param); + assert(Depth || + cast<ClassTemplateSpecializationDecl>(FTD->getDeclContext()) + ->isExplicitSpecialization()); NamedDecl *NewParam = transformTemplateParameter( - SemaRef, DC, Param, Args, Index + Depth1IndexAdjustment, Depth - 1); + SemaRef, DC, Param, Args, Index + Depth1IndexAdjustment, + Depth ? Depth - 1 : 0); if (!NewParam) return nullptr; // Constraints require that we substitute depth-1 arguments diff --git a/clang/test/SemaTemplate/deduction-guide.cpp b/clang/test/SemaTemplate/deduction-guide.cpp index a4c523595fca2..ecd152abebd74 100644 --- a/clang/test/SemaTemplate/deduction-guide.cpp +++ b/clang/test/SemaTemplate/deduction-guide.cpp @@ -691,3 +691,35 @@ Test test(42); // CHECK-NEXT: | `-ParmVarDecl {{.*}} 'auto:1' } // namespace GH122134 + +namespace GH128691 { + +template <typename = void> +class NewDeleteAllocator; + +template <> +struct NewDeleteAllocator<> { + template <typename T> + NewDeleteAllocator(T); // expected-note {{candidate template ignored}} \ + // expected-note {{implicit deduction guide declared as}} +}; + +template <typename> +struct NewDeleteAllocator : NewDeleteAllocator<> { // expected-note {{candidate template ignored}} \ + // expected-note {{implicit deduction guide declared as}} + using NewDeleteAllocator<>::NewDeleteAllocator; +}; + +void test() { NewDeleteAllocator abc(42); } // expected-error {{no viable constructor or deduction guide}} + +// CHECK-LABEL: Dumping GH128691::<deduction guide for NewDeleteAllocator>: +// CHECK-NEXT: FunctionTemplateDecl {{.+}} <deduction guide for NewDeleteAllocator> +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} typename depth 0 index 0 +// CHECK-NEXT: | `-TemplateArgument type 'void' +// CHECK-NEXT: | |-inherited from TemplateTypeParm {{.+}} depth 0 index 0 +// CHECK-NEXT: | `-BuiltinType {{.+}} 'void' +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} typename depth 0 index 1 T +// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <deduction guide for NewDeleteAllocator> 'auto (T) -> NewDeleteAllocator<type-parameter-0-0>' +// CHECK-NEXT: `-ParmVarDecl {{.+}} 'T' + +} // namespace GH128691 `````````` </details> https://github.com/llvm/llvm-project/pull/128704 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits