@@ -335,3 +335,142 @@ namespace TTP {
335335// CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}}
336336// CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0{{$}}
337337// CHECK-NEXT: `-TemplateTypeParm {{.+}} 'T'{{$}}
338+
339+ namespace GH64625 {
340+
341+ template <class T > struct X {
342+ T t[2 ];
343+ };
344+
345+ X x = {{1 , 2 }};
346+
347+ // CHECK-LABEL: Dumping GH64625::<deduction guide for X>:
348+ // CHECK-NEXT: FunctionTemplateDecl {{.+}} <{{.+}}:[[#@LINE - 7]]:1, col:27> col:27 implicit <deduction guide for X>
349+ // CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} <col:11, col:17> col:17 referenced class depth 0 index 0 T
350+ // CHECK: |-CXXDeductionGuideDecl {{.+}} <col:27> col:27 implicit <deduction guide for X> 'auto (T (&&)[2]) -> X<T>' aggregate
351+ // CHECK-NEXT: | `-ParmVarDecl {{.+}} <col:27> col:27 'T (&&)[2]'
352+ // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <col:27> col:27 implicit used <deduction guide for X> 'auto (int (&&)[2]) -> GH64625::X<int>' implicit_instantiation aggregate
353+ // CHECK-NEXT: |-TemplateArgument type 'int'
354+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
355+ // CHECK-NEXT: `-ParmVarDecl {{.+}} <col:27> col:27 'int (&&)[2]'
356+ // CHECK-NEXT: FunctionProtoType {{.+}} 'auto (T (&&)[2]) -> X<T>' dependent trailing_return
357+ // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'X<T>' dependent
358+ // CHECK-NEXT: | `-CXXRecord {{.+}} 'X'
359+ // CHECK-NEXT: `-RValueReferenceType {{.+}} 'T (&&)[2]' dependent
360+ // CHECK-NEXT: `-ConstantArrayType {{.+}} 'T[2]' dependent 2
361+ // CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0
362+ // CHECK-NEXT: `-TemplateTypeParm {{.+}} 'T'
363+
364+ template <class T , class U > struct TwoArrays {
365+ T t[2 ];
366+ U u[3 ];
367+ };
368+
369+ TwoArrays ta = {{1 , 2 }, {3 , 4 , 5 }};
370+ // CHECK-LABEL: Dumping GH64625::<deduction guide for TwoArrays>:
371+ // CHECK-NEXT: FunctionTemplateDecl {{.+}} <{{.+}}:[[#@LINE - 7]]:1, col:36> col:36 implicit <deduction guide for TwoArrays>
372+ // CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} <col:11, col:17> col:17 referenced class depth 0 index 0 T
373+ // CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} <col:20, col:26> col:26 referenced class depth 0 index 1 U
374+ // CHECK: |-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit <deduction guide for TwoArrays> 'auto (T (&&)[2], U (&&)[3]) -> TwoArrays<T, U>' aggregate
375+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'T (&&)[2]'
376+ // CHECK-NEXT: | `-ParmVarDecl {{.+}} <col:36> col:36 'U (&&)[3]'
377+ // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit used <deduction guide for TwoArrays> 'auto (int (&&)[2], int (&&)[3]) -> GH64625::TwoArrays<int, int>' implicit_instantiation aggregate
378+ // CHECK-NEXT: |-TemplateArgument type 'int'
379+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
380+ // CHECK-NEXT: |-TemplateArgument type 'int'
381+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
382+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int (&&)[2]'
383+ // CHECK-NEXT: `-ParmVarDecl {{.+}} <col:36> col:36 'int (&&)[3]'
384+ // CHECK-NEXT: FunctionProtoType {{.+}} 'auto (T (&&)[2], U (&&)[3]) -> TwoArrays<T, U>' dependent trailing_return
385+ // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'TwoArrays<T, U>' dependent
386+ // CHECK-NEXT: | `-CXXRecord {{.+}} 'TwoArrays'
387+ // CHECK-NEXT: |-RValueReferenceType {{.+}} 'T (&&)[2]' dependent
388+ // CHECK-NEXT: | `-ConstantArrayType {{.+}} 'T[2]' dependent 2
389+ // CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0
390+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T'
391+ // CHECK-NEXT: `-RValueReferenceType {{.+}} 'U (&&)[3]' dependent
392+ // CHECK-NEXT: `-ConstantArrayType {{.+}} 'U[3]' dependent 3
393+ // CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1
394+ // CHECK-NEXT: `-TemplateTypeParm {{.+}} 'U'
395+
396+ TwoArrays tb = {1 , 2 , {3 , 4 , 5 }};
397+ // CHECK: |-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit <deduction guide for TwoArrays> 'auto (T, T, U (&&)[3]) -> TwoArrays<T, U>' aggregate
398+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'T'
399+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'T'
400+ // CHECK-NEXT: | `-ParmVarDecl {{.+}} <col:36> col:36 'U (&&)[3]'
401+ // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit used <deduction guide for TwoArrays> 'auto (int, int, int (&&)[3]) -> GH64625::TwoArrays<int, int>' implicit_instantiation aggregate
402+ // CHECK-NEXT: |-TemplateArgument type 'int'
403+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
404+ // CHECK-NEXT: |-TemplateArgument type 'int'
405+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
406+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int'
407+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int'
408+ // CHECK-NEXT: `-ParmVarDecl {{.+}} <col:36> col:36 'int (&&)[3]'
409+ // CHECK-NEXT: FunctionProtoType {{.+}} 'auto (T, T, U (&&)[3]) -> TwoArrays<T, U>' dependent trailing_return
410+ // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'TwoArrays<T, U>' dependent
411+ // CHECK-NEXT: | `-CXXRecord {{.+}} 'TwoArrays'
412+ // CHECK-NEXT: |-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0
413+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T'
414+ // CHECK-NEXT: |-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0
415+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T'
416+ // CHECK-NEXT: `-RValueReferenceType {{.+}} 'U (&&)[3]' dependent
417+ // CHECK-NEXT: `-ConstantArrayType {{.+}} 'U[3]' dependent 3
418+ // CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1
419+ // CHECK-NEXT: `-TemplateTypeParm {{.+}} 'U'
420+
421+ TwoArrays tc = {{1 , 2 }, 3 , 4 , 5 };
422+ // CHECK: |-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit <deduction guide for TwoArrays> 'auto (T (&&)[2], U, U, U) -> TwoArrays<T, U>' aggregate
423+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'T (&&)[2]'
424+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'U'
425+ // CHECK-NEXT: | |-ParmVarDecl {{.+}} <col:36> col:36 'U'
426+ // CHECK-NEXT: | `-ParmVarDecl {{.+}} <col:36> col:36 'U'
427+ // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <col:36> col:36 implicit used <deduction guide for TwoArrays> 'auto (int (&&)[2], int, int, int) -> GH64625::TwoArrays<int, int>' implicit_instantiation aggregate
428+ // CHECK-NEXT: |-TemplateArgument type 'int'
429+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
430+ // CHECK-NEXT: |-TemplateArgument type 'int'
431+ // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'
432+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int (&&)[2]'
433+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int'
434+ // CHECK-NEXT: |-ParmVarDecl {{.+}} <col:36> col:36 'int'
435+ // CHECK-NEXT: `-ParmVarDecl {{.+}} <col:36> col:36 'int'
436+ // CHECK-NEXT: FunctionProtoType {{.+}} 'auto (T (&&)[2], U, U, U) -> TwoArrays<T, U>' dependent trailing_return
437+ // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'TwoArrays<T, U>' dependent
438+ // CHECK-NEXT: | `-CXXRecord {{.+}} 'TwoArrays'
439+ // CHECK-NEXT: |-RValueReferenceType {{.+}} 'T (&&)[2]' dependent
440+ // CHECK-NEXT: | `-ConstantArrayType {{.+}} 'T[2]' dependent 2
441+ // CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0
442+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T'
443+ // CHECK-NEXT: |-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1
444+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'U'
445+ // CHECK-NEXT: |-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1
446+ // CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'U'
447+ // CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1
448+ // CHECK-NEXT: `-TemplateTypeParm {{.+}} 'U'
449+
450+ } // namespace GH64625
451+
452+ namespace GH83368 {
453+
454+ template <int N> struct A {
455+ int f1[N];
456+ };
457+
458+ A a{.f1 = {1 }};
459+
460+ // CHECK-LABEL: Dumping GH83368::<deduction guide for A>:
461+ // CHECK-NEXT: FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[#@LINE - 7]]:1, col:25> col:25 implicit <deduction guide for A>
462+ // CHECK-NEXT: |-NonTypeTemplateParmDecl {{.+}} <col:11, col:15> col:15 referenced 'int' depth 0 index 0 N
463+ // CHECK: |-CXXDeductionGuideDecl {{.+}} <col:25> col:25 implicit <deduction guide for A> 'auto (int (&&)[N]) -> A<N>' aggregate
464+ // CHECK-NEXT: | `-ParmVarDecl {{.+}} <col:25> col:25 'int (&&)[N]'
465+ // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} <col:25> col:25 implicit used <deduction guide for A> 'auto (int (&&)[1]) -> GH83368::A<1>' implicit_instantiation aggregate
466+ // CHECK-NEXT: |-TemplateArgument integral '1'
467+ // CHECK-NEXT: `-ParmVarDecl {{.+}} <col:25> col:25 'int (&&)[1]'
468+ // CHECK-NEXT: FunctionProtoType {{.+}} 'auto (int (&&)[N]) -> A<N>' dependent trailing_return
469+ // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'A<N>' dependent
470+ // CHECK-NEXT: | `-CXXRecord {{.+}} 'A'
471+ // CHECK-NEXT: `-RValueReferenceType {{.+}} 'int (&&)[N]' dependent
472+ // CHECK-NEXT: `-DependentSizedArrayType {{.+}} 'int[N]' dependent
473+ // CHECK-NEXT: |-BuiltinType {{.+}} 'int'
474+ // CHECK-NEXT: `-DeclRefExpr {{.+}} <col:10> 'int' NonTypeTemplateParm {{.+}} 'N' 'int'
475+
476+ } // namespace GH83368
0 commit comments