1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | template<typename T, typename U = const T> struct Def1; |
3 | |
4 | template<> struct Def1<int> { |
5 | void foo(); |
6 | }; |
7 | |
8 | template<> struct Def1<const int> { // expected-note{{previous definition is here}} |
9 | void bar(); |
10 | }; |
11 | |
12 | template<> struct Def1<int&> { |
13 | void wibble(); |
14 | }; |
15 | |
16 | void test_Def1(Def1<int, const int> *d1, Def1<const int, const int> *d2, |
17 | Def1<int&, int&> *d3) { |
18 | d1->foo(); |
19 | d2->bar(); |
20 | d3->wibble(); |
21 | } |
22 | |
23 | template<typename T, // FIXME: bad error message below, needs better location info |
24 | typename T2 = const T*> // expected-error{{'T2' declared as a pointer to a reference}} |
25 | struct Def2; |
26 | |
27 | template<> struct Def2<int> { |
28 | void foo(); |
29 | }; |
30 | |
31 | void test_Def2(Def2<int, int const*> *d2) { |
32 | d2->foo(); |
33 | } |
34 | |
35 | typedef int& int_ref_t; |
36 | Def2<int_ref_t> *d2; // expected-note{{in instantiation of default argument for 'Def2<int &>' required here}} |
37 | |
38 | |
39 | template<> struct Def1<const int> { }; // expected-error{{redefinition of 'Def1<const int, const int>'}} |
40 | |
41 | template<typename T, typename T2 = T&> struct Def3; |
42 | |
43 | template<> struct Def3<int> { |
44 | void foo(); |
45 | }; |
46 | |
47 | template<> struct Def3<int&> { |
48 | void bar(); |
49 | }; |
50 | |
51 | void test_Def3(Def3<int, int&> *d3a, Def3<int&, int&> *d3b) { |
52 | d3a->foo(); |
53 | d3b->bar(); |
54 | } |
55 | |
56 | |
57 | template<typename T, typename T2 = T[]> struct Def4; |
58 | |
59 | template<> struct Def4<int> { |
60 | void foo(); |
61 | }; |
62 | |
63 | void test_Def4(Def4<int, int[]> *d4a) { |
64 | d4a->foo(); |
65 | } |
66 | |
67 | template<typename T, typename T2 = T const[12]> struct Def5; |
68 | |
69 | template<> struct Def5<int> { |
70 | void foo(); |
71 | }; |
72 | |
73 | template<> struct Def5<int, int const[13]> { |
74 | void bar(); |
75 | }; |
76 | |
77 | void test_Def5(Def5<int, const int[12]> *d5a, Def5<int, const int[13]> *d5b) { |
78 | d5a->foo(); |
79 | d5b->bar(); |
80 | } |
81 | |
82 | template<typename R, typename Arg1, typename Arg2 = Arg1, |
83 | typename FuncType = R (*)(Arg1, Arg2)> |
84 | struct Def6; |
85 | |
86 | template<> struct Def6<int, float> { |
87 | void foo(); |
88 | }; |
89 | |
90 | template<> struct Def6<bool, int[5], float(double, double)> { |
91 | void bar(); |
92 | }; |
93 | |
94 | bool test_Def6(Def6<int, float, float> *d6a, |
95 | Def6<int, float, float, int (*)(float, float)> *d6b, |
96 | Def6<bool, int[5], float(double, double), |
97 | bool(*)(int*, float(*)(double, double))> *d6c) { |
98 | d6a->foo(); |
99 | d6b->foo(); |
100 | d6c->bar(); |
101 | return d6a == d6b; |
102 | } |
103 | |