diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -5856,12 +5856,10 @@ // expansion. OldType = Expansion->getPattern(); IsPackExpansion = true; - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); - NewType = getDerived().TransformType(OldType); - } else { - NewType = getDerived().TransformType(OldType); } + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); + NewType = getDerived().TransformType(OldType); if (NewType.isNull()) return true; diff --git a/clang/test/SemaTemplate/packs.cpp b/clang/test/SemaTemplate/packs.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaTemplate/packs.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -ast-dump %s | FileCheck %s + +namespace pr56094 { +template struct D { + template using B = int(int (*...p)(T, U)); + template D(B *); +}; +using t1 = D::B; +// CHECK: `-TypeAliasDecl 0x{{.*}} <{{.*}}> col:{{.*}} t1 'D::B':'int (int (*)(T, U)...)' +// CHECK-NEXT: `-ElaboratedType 0x{{.*}} 'D::B' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{.*}} 'B' sugar dependent alias B +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{.*}} 'int' +// CHECK-NEXT: `-FunctionProtoType 0x{{.*}} 'int (int (*)(T, U)...)' dependent cdecl +// CHECK-NEXT: |-BuiltinType 0x{{.*}} 'int' +// CHECK-NEXT: `-PackExpansionType 0x{{.*}} 'int (*)(T, U)...' dependent +// CHECK-NEXT: `-PointerType 0x{{.*}} 'int (*)(T, U)' dependent contains_unexpanded_pack +// CHECK-NEXT: `-ParenType 0x{{.*}} 'int (T, U)' sugar dependent contains_unexpanded_pack +// CHECK-NEXT: `-FunctionProtoType 0x{{.*}} 'int (T, U)' dependent contains_unexpanded_pack cdecl +// CHECK-NEXT: |-BuiltinType 0x{{.*}} 'int' +// CHECK-NEXT: |-SubstTemplateTypeParmPackType 0x{{.*}} 'T' dependent contains_unexpanded_pack +// CHECK-NEXT: | |-TemplateTypeParmType 0x{{.*}} 'T' dependent contains_unexpanded_pack depth 0 index 0 pack +// CHECK-NEXT: | | `-TemplateTypeParm 0x{{.*}} 'T' +// CHECK-NEXT: | `-TemplateArgument pack +// CHECK-NEXT: | `-TemplateArgument type 'float' +// CHECK-NEXT: | `-BuiltinType 0x{{.*}} 'float' +// CHECK-NEXT: `-SubstTemplateTypeParmPackType 0x{{.*}} 'U' dependent contains_unexpanded_pack +// CHECK-NEXT: |-TemplateTypeParmType 0x{{.*}} 'U' dependent contains_unexpanded_pack depth 1 index 0 pack +// CHECK-NEXT: | `-TemplateTypeParm 0x{{.*}} 'U' +// CHECK-NEXT: `-TemplateArgument pack +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{.*}} 'int' +} // namespace pr56094