1 // RUN: %clang_cc1 -fsyntax-only %s -ast-dump -std=c++17 | FileCheck %s
2 
3 namespace PR46111 {
4 template <typename>
5 struct S;
6 
7 template <typename T>
8 struct HasDeductionGuide {
9   typedef PR46111::S<T> STy;
10   HasDeductionGuide(typename STy::Child);
11 };
12 
13 // This causes deduction guides to be generated for all constructors.
14 HasDeductionGuide()->HasDeductionGuide<int>;
15 
16 template <typename T>
17 struct HasDeductionGuideTypeAlias {
18   using STy = PR46111::S<T>;
19   HasDeductionGuideTypeAlias(typename STy::Child);
20 };
21 
22 // This causes deduction guides to be generated for all constructors.
23 HasDeductionGuideTypeAlias()->HasDeductionGuideTypeAlias<int>;
24 
25 // The parameter to this one shouldn't be an elaborated type.
26 // CHECK: CXXDeductionGuideDecl {{.*}} implicit <deduction guide for HasDeductionGuide> 'auto (typename STy::Child) -> HasDeductionGuide<T>'
27 // CHECK: CXXDeductionGuideDecl {{.*}} implicit <deduction guide for HasDeductionGuide> 'auto (HasDeductionGuide<T>) -> HasDeductionGuide<T>'
28 // CHECK: CXXDeductionGuideDecl {{.*}} <deduction guide for HasDeductionGuide> 'auto () -> HasDeductionGuide<int>'
29 // CHECK: CXXDeductionGuideDecl {{.*}} implicit <deduction guide for HasDeductionGuideTypeAlias> 'auto (typename STy::Child) -> HasDeductionGuideTypeAlias<T>'
30 // CHECK: CXXDeductionGuideDecl {{.*}} implicit <deduction guide for HasDeductionGuideTypeAlias> 'auto (HasDeductionGuideTypeAlias<T>) -> HasDeductionGuideTypeAlias<T>'
31 // CHECK: CXXDeductionGuideDecl {{.*}} <deduction guide for HasDeductionGuideTypeAlias> 'auto () -> HasDeductionGuideTypeAlias<int>'
32 } // namespace PR46111
33