https://github.com/zyn0217 updated https://github.com/llvm/llvm-project/pull/141741
>From 4fdb0069e260e36d8cbd021536adc14f6b9ddef1 Mon Sep 17 00:00:00 2001 From: Younan Zhang <zyn7...@gmail.com> Date: Wed, 28 May 2025 18:37:38 +0800 Subject: [PATCH 1/2] [Clang] Reset ArgPackSubstIndex before rewriting CTAD template parameters 032ad59 taught the instantiator to expand template argument packs for rewrite. However we might already be in a pack expansion when we synthesizing the CTAD guide, so we reset the ArgPackSubstIndex to ensure it doesn't get confused. --- clang/lib/Sema/SemaTemplateDeductionGuide.cpp | 4 ++ clang/test/SemaTemplate/deduction-guide.cpp | 53 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp index 29c5736a9bf9e..b5394a75479f1 100644 --- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp +++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp @@ -1099,6 +1099,10 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef, // parameters, used for building `TemplateArgsForBuildingFPrime`. SmallVector<TemplateArgument, 16> TransformedDeducedAliasArgs( AliasTemplate->getTemplateParameters()->size()); + // We might be already within a pack expansion, but rewriting template + // parameters is independent of that. (We may or may not expand new packs + // when rewriting. So clear the state) + Sema::ArgPackSubstIndexRAII _(SemaRef, std::nullopt); for (unsigned AliasTemplateParamIdx : DeducedAliasTemplateParams) { auto *TP = diff --git a/clang/test/SemaTemplate/deduction-guide.cpp b/clang/test/SemaTemplate/deduction-guide.cpp index c1ce55e1c8029..faabba5539503 100644 --- a/clang/test/SemaTemplate/deduction-guide.cpp +++ b/clang/test/SemaTemplate/deduction-guide.cpp @@ -913,3 +913,56 @@ void f() { // CHECK-NEXT: `-ParmVarDecl {{.+}} 'int' } + +namespace GH141425 { + +template<class... Lambda> +struct Container +{ + Container(Lambda...) {} +}; + +template<class... T> +using Alias = Container<T...>; + +template<class = void> +struct Invocable { + using T = decltype([]() { + (void)Alias([]() -> void {}); + }()); +}; + +struct Type { + using T = bool; +}; + +template<class...> +struct ExpandType { + using T = bool; +}; + +template<class... X> +using Expand = ExpandType<typename X::T...>; + +Expand<Type, Invocable<>> _{}; + +// CHECK-LABEL: Dumping GH141425::<deduction guide for Alias>: +// CHECK-NEXT: FunctionTemplateDecl {{.+}} implicit <deduction guide for Alias> +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 ... T +// CHECK-NEXT: |-TypeTraitExpr {{.+}} 'bool' __is_deducible +// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.+}} 'GH141425::Alias' dependent +// CHECK-NEXT: | | `-name: 'GH141425::Alias' +// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} Alias +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'Container<T...>' dependent +// CHECK-NEXT: | |-name: 'Container':'GH141425::Container' qualified +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} Container +// CHECK-NEXT: | `-TemplateArgument type 'T...':'type-parameter-0-0...' +// CHECK-NEXT: | `-PackExpansionType {{.+}} 'T...' dependent +// CHECK-NEXT: | `-SubstTemplateTypeParmType {{.+}} 'T' sugar dependent contains_unexpanded_pack class depth 0 index 0 ... Lambda pack_index 0 +// CHECK-NEXT: | |-FunctionTemplate {{.+}} '<deduction guide for Container>' +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'T' dependent contains_unexpanded_pack depth 0 index 0 pack +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T' +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} implicit <deduction guide for Alias> 'auto (T...) -> Container<T...>' +// CHECK-NEXT: | `-ParmVarDecl {{.+}} 'T...' pack + +} >From baacafbf8ec3249bad7f827501db6f9291ee26cf Mon Sep 17 00:00:00 2001 From: Younan Zhang <zyn7...@gmail.com> Date: Wed, 28 May 2025 23:32:52 +0800 Subject: [PATCH 2/2] Address feedback Co-authored-by: Erich Keane <eke...@nvidia.com> --- clang/lib/Sema/SemaTemplateDeductionGuide.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp index b5394a75479f1..c75013b05d990 100644 --- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp +++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp @@ -1102,7 +1102,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef, // We might be already within a pack expansion, but rewriting template // parameters is independent of that. (We may or may not expand new packs // when rewriting. So clear the state) - Sema::ArgPackSubstIndexRAII _(SemaRef, std::nullopt); + Sema::ArgPackSubstIndexRAII PackSubstReset(SemaRef, std::nullopt); for (unsigned AliasTemplateParamIdx : DeducedAliasTemplateParams) { auto *TP = _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits