xref: /aosp_15_r20/external/clang/test/Misc/ast-dump-templates.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -ast-print %s > %t
2*67e74705SXin Li // RUN: FileCheck < %t %s -check-prefix=CHECK1
3*67e74705SXin Li // RUN: FileCheck < %t %s -check-prefix=CHECK2
4*67e74705SXin Li // RUN: %clang_cc1 -ast-dump %s | FileCheck --check-prefix=DUMP %s
5*67e74705SXin Li 
6*67e74705SXin Li template <int X, typename Y, int Z = 5>
7*67e74705SXin Li struct foo {
8*67e74705SXin Li   int constant;
foofoo9*67e74705SXin Li   foo() {}
getSumfoo10*67e74705SXin Li   Y getSum() { return Y(X + Z); }
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li template <int A, typename B>
bar()14*67e74705SXin Li B bar() {
15*67e74705SXin Li   return B(A);
16*67e74705SXin Li }
17*67e74705SXin Li 
baz()18*67e74705SXin Li void baz() {
19*67e74705SXin Li   int x = bar<5, int>();
20*67e74705SXin Li   int y = foo<5, int>().getSum();
21*67e74705SXin Li   double z = foo<2, double, 3>().getSum();
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li // Template instantiation - foo
25*67e74705SXin Li // Since the order of instantiation may vary during runs, run FileCheck twice
26*67e74705SXin Li // to make sure each instantiation is in the correct spot.
27*67e74705SXin Li // CHECK1: template <int X = 5, typename Y = int, int Z = 5> struct foo {
28*67e74705SXin Li // CHECK2: template <int X = 2, typename Y = double, int Z = 3> struct foo {
29*67e74705SXin Li 
30*67e74705SXin Li // Template definition - foo
31*67e74705SXin Li // CHECK1: template <int X, typename Y, int Z = 5> struct foo {
32*67e74705SXin Li // CHECK2: template <int X, typename Y, int Z = 5> struct foo {
33*67e74705SXin Li 
34*67e74705SXin Li // Template instantiation - bar
35*67e74705SXin Li // CHECK1: template <int A = 5, typename B = int> int bar()
36*67e74705SXin Li // CHECK2: template <int A = 5, typename B = int> int bar()
37*67e74705SXin Li 
38*67e74705SXin Li // Template definition - bar
39*67e74705SXin Li // CHECK1: template <int A, typename B> B bar()
40*67e74705SXin Li // CHECK2: template <int A, typename B> B bar()
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK1-LABEL: template <typename ...T> struct A {
43*67e74705SXin Li // CHECK1-NEXT:    template <T ...x[3]> struct B {
44*67e74705SXin Li template <typename ...T> struct A {
45*67e74705SXin Li   template <T ...x[3]> struct B {};
46*67e74705SXin Li };
47*67e74705SXin Li 
48*67e74705SXin Li // CHECK1-LABEL: template <typename ...T> void f(T ...[3]) {
49*67e74705SXin Li // CHECK1-NEXT:    A<T [3]...> a;
f(T...[3])50*67e74705SXin Li template <typename ...T> void f(T ...[3]) {
51*67e74705SXin Li   A<T [3]...> a;
52*67e74705SXin Li }
53*67e74705SXin Li 
54*67e74705SXin Li namespace test2 {
55*67e74705SXin Li void func(int);
56*67e74705SXin Li void func(float);
57*67e74705SXin Li template<typename T>
tmpl()58*67e74705SXin Li void tmpl() {
59*67e74705SXin Li   func(T());
60*67e74705SXin Li }
61*67e74705SXin Li 
62*67e74705SXin Li // DUMP: UnresolvedLookupExpr {{.*}} <col:3> '<overloaded function type>' lvalue (ADL) = 'func'
63*67e74705SXin Li }
64