@@ -335,3 +335,142 @@ namespace TTP {
335
335
// CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}}
336
336
// CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0{{$}}
337
337
// 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