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