Author: Haojian Wu Date: 2024-05-20T16:11:15+02:00 New Revision: 1553b21f6d3b620b8e32121b974793342820ab8c
URL: https://github.com/llvm/llvm-project/commit/1553b21f6d3b620b8e32121b974793342820ab8c DIFF: https://github.com/llvm/llvm-project/commit/1553b21f6d3b620b8e32121b974793342820ab8c.diff LOG: [clang] CTAD alias: Fix missing template arg packs during the transformation (#92535) clang rejects some valid code (see testcases) because of an incorrect transformed deduction guides. This patch fixes it. We miss the template argument packs during the transformation (`auto (type-parameter-0-0...) -> Foo<>`). In `TreeTransform::TransformTemplateArguments `, we have a logic of handling template argument packs which were originally added to support CTAD alias, it doesn't seem to be needed, we need to unpack them. Added: Modified: clang/lib/Sema/TreeTransform.h clang/test/AST/ast-dump-ctad-alias.cpp clang/test/SemaCXX/cxx20-ctad-type-alias.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index b10e5ba65eb1c..f9fec21bf5bb6 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -4818,14 +4818,6 @@ bool TreeTransform<Derived>::TransformTemplateArguments( TemplateArgumentLoc In = *First; if (In.getArgument().getKind() == TemplateArgument::Pack) { - // When building the deduction guides, we rewrite the argument packs - // instead of unpacking. - if (getSema().CodeSynthesisContexts.back().Kind == - Sema::CodeSynthesisContext::BuildingDeductionGuides) { - if (getDerived().TransformTemplateArgument(In, Out, Uneval)) - return true; - continue; - } // Unpack argument packs, which we translate them into separate // arguments. // FIXME: We could do much better if we could guarantee that the diff --git a/clang/test/AST/ast-dump-ctad-alias.cpp b/clang/test/AST/ast-dump-ctad-alias.cpp index 7fe6c05621eee..9382558393e4c 100644 --- a/clang/test/AST/ast-dump-ctad-alias.cpp +++ b/clang/test/AST/ast-dump-ctad-alias.cpp @@ -48,3 +48,23 @@ Out2<double>::AInner t(1.0); // CHECK-NEXT: | |-TemplateArgument type 'double' // CHECK-NEXT: | | `-BuiltinType {{.*}} 'double' // CHECK-NEXT: | `-ParmVarDecl {{.*}} 'double' + +template <typename... T1> +struct Foo { + Foo(T1...); +}; + +template <typename...T2> +using AFoo = Foo<T2...>; +AFoo a(1, 2); +// CHECK: |-CXXDeductionGuideDecl {{.*}} implicit <deduction guide for AFoo> 'auto (type-parameter-0-0...) -> Foo<type-parameter-0-0...>' +// CHECK-NEXT: | | `-ParmVarDecl {{.*}} 'type-parameter-0-0...' pack +// CHECK-NEXT: | `-CXXDeductionGuideDecl {{.*}} implicit used <deduction guide for AFoo> 'auto (int, int) -> Foo<int, int>' implicit_instantiation + +template <typename T> +using BFoo = Foo<T, T>; +BFoo b2(1.0, 2.0); +// CHECK: |-CXXDeductionGuideDecl {{.*}} implicit <deduction guide for BFoo> 'auto (type-parameter-0-0, type-parameter-0-0) -> Foo<type-parameter-0-0, type-parameter-0-0>' +// CHECK-NEXT: | | |-ParmVarDecl {{.*}} 'type-parameter-0-0' +// CHECK-NEXT: | | `-ParmVarDecl {{.*}} 'type-parameter-0-0' +// CHECK-NEXT: | `-CXXDeductionGuideDecl {{.*}} implicit used <deduction guide for BFoo> 'auto (double, double) -> Foo<double, double>' implicit_instantiation diff --git a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp index 285532e3d80dd..4c6ef5adae7d2 100644 --- a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp +++ b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp @@ -173,6 +173,11 @@ template <typename... Ts> using AFoo = Foo<Ts...>; auto b = AFoo{}; +AFoo a(1, 2); + +template <typename T> +using BFoo = Foo<T, T>; +BFoo b2(1.0, 2.0); } // namespace test13 namespace test14 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits