|
1 |
| -// RUN: %clang_cc1 -std=c++2a -verify -ast-dump -ast-dump-decl-types -ast-dump-filter "deduction guide" %s | FileCheck %s --strict-whitespace |
| 1 | +// RUN: %clang_cc1 -std=c++2a -verify -ast-dump -ast-dump-decl-types -ast-dump-filter "deduction guide" %s | FileCheck %s --strict-whitespace -dump-input=always |
2 | 2 |
|
3 | 3 | template<auto ...> struct X {};
|
4 | 4 | template<template<typename X, X> typename> struct Y {};
|
@@ -771,3 +771,118 @@ D d(24);
|
771 | 771 | // CHECK-NEXT: `-ParmVarDecl {{.+}} 'U'
|
772 | 772 |
|
773 | 773 | } // namespace GH132616_DeductionGuide
|
| 774 | + |
| 775 | +namespace GH133132 { |
| 776 | + |
| 777 | +template <class _Ty> |
| 778 | +struct A {}; |
| 779 | + |
| 780 | +template <class T = int, class U = T> |
| 781 | +using AA = A<U>; |
| 782 | + |
| 783 | +AA a{}; |
| 784 | + |
| 785 | +// CHECK-LABEL: Dumping GH133132::<deduction guide for AA>: |
| 786 | +// CHECK-NEXT: FunctionTemplateDecl {{.+}} implicit <deduction guide for AA> |
| 787 | +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 T |
| 788 | +// CHECK-NEXT: | `-TemplateArgument type 'int' |
| 789 | +// CHECK-NEXT: | `-BuiltinType {{.+}} 'int' |
| 790 | +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 1 U |
| 791 | +// CHECK-NEXT: | `-TemplateArgument type 'T':'type-parameter-0-0' |
| 792 | +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0 |
| 793 | +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T' |
| 794 | +// CHECK-NEXT: |-TypeTraitExpr {{.+}} 'bool' __is_deducible |
| 795 | +// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.+}} 'GH133132::AA' dependent |
| 796 | +// CHECK-NEXT: | | `-name: 'GH133132::AA' |
| 797 | +// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} AA |
| 798 | +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'A<U>' dependent |
| 799 | +// CHECK-NEXT: | |-name: 'A':'GH133132::A' qualified |
| 800 | +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} A |
| 801 | +// CHECK-NEXT: | `-TemplateArgument type 'U':'type-parameter-0-1' |
| 802 | +// CHECK-NEXT: | `-SubstTemplateTypeParmType {{.+}} 'U' sugar dependent class depth 0 index 0 _Ty |
| 803 | +// CHECK-NEXT: | |-FunctionTemplate {{.+}} '<deduction guide for A>' |
| 804 | +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1 |
| 805 | +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'U' |
| 806 | +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} implicit <deduction guide for AA> 'auto () -> A<U>' |
| 807 | +// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} implicit used <deduction guide for AA> 'auto () -> A<int>' implicit_instantiation |
| 808 | +// CHECK-NEXT: |-TemplateArgument type 'int' |
| 809 | +// CHECK-NEXT: | `-BuiltinType {{.+}} 'int' |
| 810 | +// CHECK-NEXT: `-TemplateArgument type 'int' |
| 811 | +// CHECK-NEXT: `-BuiltinType {{.+}} 'int' |
| 812 | + |
| 813 | +template <template <class> class _X> |
| 814 | +struct B {}; |
| 815 | + |
| 816 | +template <template <class> class _X = A, template <class> class _Y = _X> |
| 817 | +using BB = B<_Y>; |
| 818 | + |
| 819 | +BB b{}; |
| 820 | + |
| 821 | +// CHECK-LABEL: Dumping GH133132::<deduction guide for BB>: |
| 822 | +// CHECK-NEXT: FunctionTemplateDecl {{.+}} implicit <deduction guide for BB> |
| 823 | +// CHECK-NEXT: |-TemplateTemplateParmDecl {{.+}} depth 0 index 0 _X |
| 824 | +// CHECK-NEXT: | |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 |
| 825 | +// CHECK-NEXT: | `-TemplateArgument {{.+}} template 'A':'GH133132::A' qualified |
| 826 | +// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A |
| 827 | +// CHECK-NEXT: |-TemplateTemplateParmDecl {{.+}} depth 0 index 1 _Y |
| 828 | +// CHECK-NEXT: | |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 |
| 829 | +// CHECK-NEXT: | `-TemplateArgument {{.+}} template '_X':'template-parameter-0-0' qualified |
| 830 | +// CHECK-NEXT: | `-TemplateTemplateParmDecl {{.+}} depth 0 index 0 _X |
| 831 | +// CHECK-NEXT: |-TypeTraitExpr {{.+}} 'bool' __is_deducible |
| 832 | +// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.+}} 'GH133132::BB' dependent |
| 833 | +// CHECK-NEXT: | | `-name: 'GH133132::BB' |
| 834 | +// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} BB |
| 835 | +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'B<_Y>' dependent |
| 836 | +// CHECK-NEXT: | |-name: 'B':'GH133132::B' qualified |
| 837 | +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} B |
| 838 | +// CHECK-NEXT: | `-TemplateArgument template '_Y':'template-parameter-0-1' subst index 0 |
| 839 | +// CHECK-NEXT: | |-parameter: TemplateTemplateParmDecl {{.+}} depth 0 index 0 _X |
| 840 | +// CHECK-NEXT: | |-associated FunctionTemplate {{.+}} '<deduction guide for B>' |
| 841 | +// CHECK-NEXT: | `-replacement: '_Y':'template-parameter-0-1' qualified |
| 842 | +// CHECK-NEXT: | `-TemplateTemplateParmDecl {{.+}} depth 0 index 1 _Y |
| 843 | +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} implicit <deduction guide for BB> 'auto () -> B<_Y>' |
| 844 | +// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} implicit used <deduction guide for BB> 'auto () -> B<GH133132::A>' implicit_instantiation |
| 845 | +// CHECK-NEXT: |-TemplateArgument template 'GH133132::A' |
| 846 | +// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A |
| 847 | +// CHECK-NEXT: `-TemplateArgument template 'GH133132::A' |
| 848 | +// CHECK-NEXT: `-ClassTemplateDecl {{.+}} A |
| 849 | + |
| 850 | +template <int N = 42, class U = A<decltype(N)>> |
| 851 | +using CC = A<U>; |
| 852 | + |
| 853 | +CC c{}; |
| 854 | + |
| 855 | +// CHECK-LABEL: Dumping GH133132::<deduction guide for CC>: |
| 856 | +// CHECK-NEXT: FunctionTemplateDecl {{.+}} implicit <deduction guide for CC> |
| 857 | +// CHECK-NEXT: |-NonTypeTemplateParmDecl {{.+}} 'int' depth 0 index 0 N |
| 858 | +// CHECK-NEXT: | `-TemplateArgument {{.+}} expr '42' |
| 859 | +// CHECK-NEXT: | `-IntegerLiteral {{.+}} 'int' 42 |
| 860 | +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 1 U |
| 861 | +// CHECK-NEXT: | `-TemplateArgument type 'A<decltype(N)>' |
| 862 | +// CHECK-NEXT: | `-ElaboratedType {{.+}} 'A<decltype(N)>' sugar dependent |
| 863 | +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'A<decltype(N)>' dependent |
| 864 | +// CHECK-NEXT: | |-name: 'A':'GH133132::A' qualified |
| 865 | +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} A |
| 866 | +// CHECK-NEXT: | `-TemplateArgument type 'decltype(N)' |
| 867 | +// CHECK-NEXT: | `-DecltypeType {{.+}} 'decltype(N)' dependent |
| 868 | +// CHECK-NEXT: | `-DeclRefExpr {{.+}} 'int' NonTypeTemplateParm {{.+}} 'N' 'int' |
| 869 | +// CHECK-NEXT: |-TypeTraitExpr {{.+}} 'bool' __is_deducible |
| 870 | +// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.+}} 'GH133132::CC' dependent |
| 871 | +// CHECK-NEXT: | | `-name: 'GH133132::CC' |
| 872 | +// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} CC |
| 873 | +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'A<U>' dependent |
| 874 | +// CHECK-NEXT: | |-name: 'A':'GH133132::A' qualified |
| 875 | +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} A |
| 876 | +// CHECK-NEXT: | `-TemplateArgument type 'U':'type-parameter-0-1' |
| 877 | +// CHECK-NEXT: | `-SubstTemplateTypeParmType {{.+}} 'U' sugar dependent class depth 0 index 0 _Ty |
| 878 | +// CHECK-NEXT: | |-FunctionTemplate {{.+}} '<deduction guide for A>' |
| 879 | +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1 |
| 880 | +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'U' |
| 881 | +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} implicit <deduction guide for CC> 'auto () -> A<U>' |
| 882 | +// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} implicit used <deduction guide for CC> 'auto () -> A<GH133132::A<int>>' implicit_instantiation |
| 883 | +// CHECK-NEXT: |-TemplateArgument integral '42' |
| 884 | +// CHECK-NEXT: `-TemplateArgument type 'GH133132::A<int>' |
| 885 | +// CHECK-NEXT: `-RecordType {{.+}} 'GH133132::A<int>' |
| 886 | +// CHECK-NEXT: `-ClassTemplateSpecialization {{.+}} 'A' |
| 887 | + |
| 888 | +} |
0 commit comments