xref: /aosp_15_r20/external/clang/test/SemaTemplate/template-id-printing.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -ast-print %s | FileCheck %s
2*67e74705SXin Li namespace N {
3*67e74705SXin Li   template<typename T, typename U> void f(U);
4*67e74705SXin Li   template<int> void f();
5*67e74705SXin Li }
6*67e74705SXin Li 
g()7*67e74705SXin Li void g() {
8*67e74705SXin Li   // CHECK: N::f<int>(3.14
9*67e74705SXin Li   N::f<int>(3.14);
10*67e74705SXin Li 
11*67e74705SXin Li   // CHECK: N::f<double>
12*67e74705SXin Li   void (*fp)(int) = N::f<double>;
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li 
16*67e74705SXin Li // (NNS qualified) DeclRefExpr.
17*67e74705SXin Li namespace DRE {
18*67e74705SXin Li 
19*67e74705SXin Li template <typename T>
20*67e74705SXin Li void foo();
21*67e74705SXin Li 
test()22*67e74705SXin Li void test() {
23*67e74705SXin Li   // CHECK: DRE::foo<int>;
24*67e74705SXin Li   DRE::foo<int>;
25*67e74705SXin Li   // CHECK: DRE::template foo<int>;
26*67e74705SXin Li   DRE::template foo<int>;
27*67e74705SXin Li   // CHECK: DRE::foo<int>();
28*67e74705SXin Li   DRE::foo<int>();
29*67e74705SXin Li   // CHECK: DRE::template foo<int>();
30*67e74705SXin Li   DRE::template foo<int>();
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li } // namespace DRE
34*67e74705SXin Li 
35*67e74705SXin Li 
36*67e74705SXin Li // MemberExpr.
37*67e74705SXin Li namespace ME {
38*67e74705SXin Li 
39*67e74705SXin Li struct S {
40*67e74705SXin Li   template <typename T>
41*67e74705SXin Li   void mem();
42*67e74705SXin Li };
43*67e74705SXin Li 
test()44*67e74705SXin Li void test() {
45*67e74705SXin Li   S s;
46*67e74705SXin Li   // CHECK: s.mem<int>();
47*67e74705SXin Li   s.mem<int>();
48*67e74705SXin Li   // CHECK: s.template mem<int>();
49*67e74705SXin Li   s.template mem<int>();
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li } // namespace ME
53*67e74705SXin Li 
54*67e74705SXin Li 
55*67e74705SXin Li // UnresolvedLookupExpr.
56*67e74705SXin Li namespace ULE {
57*67e74705SXin Li 
58*67e74705SXin Li template <typename T>
59*67e74705SXin Li int foo();
60*67e74705SXin Li 
61*67e74705SXin Li template <typename T>
test()62*67e74705SXin Li void test() {
63*67e74705SXin Li   // CHECK: ULE::foo<T>;
64*67e74705SXin Li   ULE::foo<T>;
65*67e74705SXin Li   // CHECK: ULE::template foo<T>;
66*67e74705SXin Li   ULE::template foo<T>;
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li } // namespace ULE
70*67e74705SXin Li 
71*67e74705SXin Li 
72*67e74705SXin Li // UnresolvedMemberExpr.
73*67e74705SXin Li namespace UME {
74*67e74705SXin Li 
75*67e74705SXin Li struct S {
76*67e74705SXin Li   template <typename T>
77*67e74705SXin Li   void mem();
78*67e74705SXin Li };
79*67e74705SXin Li 
80*67e74705SXin Li template <typename U>
test()81*67e74705SXin Li void test() {
82*67e74705SXin Li   S s;
83*67e74705SXin Li   // CHECK: s.mem<U>();
84*67e74705SXin Li   s.mem<U>();
85*67e74705SXin Li   // CHECK: s.template mem<U>();
86*67e74705SXin Li   s.template mem<U>();
87*67e74705SXin Li }
88*67e74705SXin Li 
89*67e74705SXin Li } // namespace UME
90*67e74705SXin Li 
91*67e74705SXin Li 
92*67e74705SXin Li // DependentScopeDeclRefExpr.
93*67e74705SXin Li namespace DSDRE {
94*67e74705SXin Li 
95*67e74705SXin Li template <typename T>
96*67e74705SXin Li struct S;
97*67e74705SXin Li 
98*67e74705SXin Li template <typename T>
test()99*67e74705SXin Li void test() {
100*67e74705SXin Li   // CHECK: S<T>::foo;
101*67e74705SXin Li   S<T>::foo;
102*67e74705SXin Li   // CHECK: S<T>::template foo;
103*67e74705SXin Li   S<T>::template foo;
104*67e74705SXin Li   // CHECK: S<T>::template foo<>;
105*67e74705SXin Li   S<T>::template foo<>;
106*67e74705SXin Li   // CHECK: S<T>::template foo<T>;
107*67e74705SXin Li   S<T>::template foo<T>;
108*67e74705SXin Li }
109*67e74705SXin Li 
110*67e74705SXin Li } // namespace DSDRE
111*67e74705SXin Li 
112*67e74705SXin Li 
113*67e74705SXin Li // DependentScopeMemberExpr.
114*67e74705SXin Li namespace DSME {
115*67e74705SXin Li 
116*67e74705SXin Li template <typename T>
117*67e74705SXin Li struct S;
118*67e74705SXin Li 
119*67e74705SXin Li template <typename T>
test()120*67e74705SXin Li void test() {
121*67e74705SXin Li   S<T> s;
122*67e74705SXin Li   // CHECK: s.foo;
123*67e74705SXin Li   s.foo;
124*67e74705SXin Li   // CHECK: s.template foo;
125*67e74705SXin Li   s.template foo;
126*67e74705SXin Li   // CHECK: s.template foo<>;
127*67e74705SXin Li   s.template foo<>;
128*67e74705SXin Li   // CHECK: s.template foo<T>;
129*67e74705SXin Li   s.template foo<T>;
130*67e74705SXin Li }
131*67e74705SXin Li 
132*67e74705SXin Li } // namespace DSME
133*67e74705SXin Li 
134*67e74705SXin Li namespace DSDRE_withImplicitTemplateArgs {
135*67e74705SXin Li 
foo()136*67e74705SXin Li template <typename T> void foo() {
137*67e74705SXin Li   // CHECK: T::template bar();
138*67e74705SXin Li   T::template bar();
139*67e74705SXin Li }
140*67e74705SXin Li 
141*67e74705SXin Li } // namespace DSDRE_withImplicitTemplateArgs
142