blob: ebc3a5293f2bbbcbc2b874615b96c6f5e42f3afa [file] [log] [blame]
Douglas Gregore704c9d2009-08-27 16:57:43 +00001// RUN: clang-cc -fsyntax-only -verify %s
2
3template<typename T>
4struct X0 {
5 template<typename U> T f0(U);
6 template<typename U> U& f1(T*, U); // expected-error{{pointer to a reference}} \
7 // expected-note{{candidate}}
8};
9
10X0<int> x0i;
11X0<void> x0v;
12X0<int&> x0ir; // expected-note{{instantiation}}
13
14void test_X0(int *ip, double *dp) {
15 X0<int> xi;
16 int i1 = xi.f0(ip);
17 double *&dpr = xi.f1(ip, dp);
18 xi.f1(dp, dp); // expected-error{{no matching}}
19
20 X0<void> xv;
21 double *&dpr2 = xv.f1(ip, dp);
22}
Douglas Gregora654dd82009-08-28 17:37:35 +000023
Douglas Gregor01afeef2009-08-28 20:31:08 +000024template<typename T>
25struct X1 {
26 template<typename U>
27 struct Inner0 {
28 U x;
29 T y; // expected-error{{void}}
30 };
31
32 template<typename U>
33 struct Inner1 {
34 U x; // expected-error{{void}}
Douglas Gregor39cacdb2009-08-28 20:50:45 +000035 T y;
36 };
37
38 template<typename U>
39 struct Inner2 {
40 struct SuperInner {
41 U z; // expected-error{{void}}
42 };
Douglas Gregor01afeef2009-08-28 20:31:08 +000043 };
Douglas Gregord99bb432009-08-28 21:09:48 +000044
45 template<typename U>
46 struct Inner3 {
47 void f0(T t, U u) {
48 (void)(t + u); // expected-error{{invalid operands}}
49 }
50
51 template<typename V>
52 V f1(T t, U u, V) {
53 return t + u; // expected-error{{incompatible type}}
54 }
55 };
56
Douglas Gregor5c580932009-08-28 21:15:08 +000057 template<typename U>
58 struct Inner4;
Douglas Gregor01afeef2009-08-28 20:31:08 +000059};
60
Douglas Gregor5c580932009-08-28 21:15:08 +000061template<typename T>
62template<typename U>
63struct X1<T>::Inner4 {
64 template<typename V>
65 V f2(T t, U u, V);
66};
67
68template<typename T>
69template<typename U>
70template<typename V>
71V X1<T>::Inner4<U>::f2(T t, U u, V) {
72 return t + u; // expected-error{{incompatible type}}
73}
74
Douglas Gregord99bb432009-08-28 21:09:48 +000075void test_X1(int *ip, int i, double *dp) {
Douglas Gregor01afeef2009-08-28 20:31:08 +000076 X1<void>::Inner0<int> *xvip; // okay
77 X1<void>::Inner0<int> xvi; // expected-note{{instantiation}}
78
79 X1<int>::Inner1<void> *xivp; // okay
80 X1<int>::Inner1<void> xiv; // expected-note{{instantiation}}
Douglas Gregor39cacdb2009-08-28 20:50:45 +000081
82 X1<int>::Inner2<void>::SuperInner *xisivp; // okay
83 X1<int>::Inner2<void>::SuperInner xisiv; // expected-note{{instantiation}}
Douglas Gregord99bb432009-08-28 21:09:48 +000084
85 X1<int*>::Inner3<int> id3;
86 id3.f0(ip, i);
87 id3.f0(dp, i); // expected-error{{incompatible type}}
88 id3.f1(ip, i, ip);
89 id3.f1(ip, i, dp); // expected-note{{instantiation}}
90
91 X1<int*>::Inner3<double*> id3b;
92 id3b.f0(ip, dp); // expected-note{{instantiation}}
Douglas Gregor5c580932009-08-28 21:15:08 +000093
94 X1<int*>::Inner4<int> id4;
95 id4.f2(ip, i, dp); // expected-note{{instantiation}}
Douglas Gregor01afeef2009-08-28 20:31:08 +000096}