1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li
5*67e74705SXin Li // <rdar://problem/8124080>
6*67e74705SXin Li template<typename _Alloc> class allocator;
7*67e74705SXin Li template<class _CharT> struct char_traits;
8*67e74705SXin Li template<typename _CharT, typename _Traits = char_traits<_CharT>,
9*67e74705SXin Li typename _Alloc = allocator<_CharT> >
10*67e74705SXin Li class basic_string;
11*67e74705SXin Li template<typename _CharT, typename _Traits, typename _Alloc>
12*67e74705SXin Li const typename basic_string<_CharT, _Traits, _Alloc>::size_type
13*67e74705SXin Li basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_max_size // expected-error{{no member named '_Rep' in 'basic_string<_CharT, _Traits, _Alloc>'}}
14*67e74705SXin Li = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
15*67e74705SXin Li
16*67e74705SXin Li // PR7118
17*67e74705SXin Li template<typename T>
18*67e74705SXin Li class Foo {
19*67e74705SXin Li class Bar;
f()20*67e74705SXin Li void f() {
21*67e74705SXin Li Bar i;
22*67e74705SXin Li }
23*67e74705SXin Li };
24*67e74705SXin Li
25*67e74705SXin Li // PR7625
26*67e74705SXin Li template<typename T> struct a : T {
27*67e74705SXin Li struct x : T {
aaa::x28*67e74705SXin Li int aa() { return p; } // expected-error{{use of undeclared identifier 'p'}}
29*67e74705SXin Li };
30*67e74705SXin Li };
31*67e74705SXin Li
32*67e74705SXin Li // rdar://8605381
33*67e74705SXin Li namespace rdar8605381 {
34*67e74705SXin Li struct X {};
35*67e74705SXin Li
36*67e74705SXin Li struct Y { // expected-note{{candidate constructor (the implicit copy constructor) not viable}}
37*67e74705SXin Li #if __cplusplus >= 201103L // C++11 or later
38*67e74705SXin Li // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable}}
39*67e74705SXin Li #endif
40*67e74705SXin Li
41*67e74705SXin Li Y();
42*67e74705SXin Li };
43*67e74705SXin Li
44*67e74705SXin Li struct {
45*67e74705SXin Li Y obj;
46*67e74705SXin Li } objs[] = {
47*67e74705SXin Li new Y // expected-error{{no viable conversion}}
48*67e74705SXin Li };
49*67e74705SXin Li }
50*67e74705SXin Li
51*67e74705SXin Li // http://llvm.org/PR8234
52*67e74705SXin Li namespace PR8234 {
53*67e74705SXin Li template<typename Signature>
54*67e74705SXin Li class callback
55*67e74705SXin Li {
56*67e74705SXin Li };
57*67e74705SXin Li
58*67e74705SXin Li template<typename R , typename ARG_TYPE0>
59*67e74705SXin Li class callback<R( ARG_TYPE0)>
60*67e74705SXin Li {
61*67e74705SXin Li public:
callback()62*67e74705SXin Li callback() {}
63*67e74705SXin Li };
64*67e74705SXin Li
65*67e74705SXin Li template< typename ARG_TYPE0>
66*67e74705SXin Li class callback<void( ARG_TYPE0)>
67*67e74705SXin Li {
68*67e74705SXin Li public:
callback()69*67e74705SXin Li callback() {}
70*67e74705SXin Li };
71*67e74705SXin Li
f()72*67e74705SXin Li void f()
73*67e74705SXin Li {
74*67e74705SXin Li callback<void(const int&)> op;
75*67e74705SXin Li }
76*67e74705SXin Li }
77*67e74705SXin Li
78*67e74705SXin Li namespace PR9007 {
79*67e74705SXin Li struct bar {
80*67e74705SXin Li enum xxx {
81*67e74705SXin Li yyy = sizeof(struct foo*)
82*67e74705SXin Li };
83*67e74705SXin Li foo *xxx();
84*67e74705SXin Li };
85*67e74705SXin Li }
86*67e74705SXin Li
87*67e74705SXin Li namespace PR9026 {
88*67e74705SXin Li class InfallibleTArray {
89*67e74705SXin Li };
90*67e74705SXin Li class Variant;
91*67e74705SXin Li class CompVariant {
92*67e74705SXin Li operator const InfallibleTArray&() const;
93*67e74705SXin Li };
94*67e74705SXin Li class Variant {
95*67e74705SXin Li operator const CompVariant&() const;
96*67e74705SXin Li };
97*67e74705SXin Li void Write(const Variant& __v);
98*67e74705SXin Li void Write(const InfallibleTArray& __v);
99*67e74705SXin Li Variant x;
Write2()100*67e74705SXin Li void Write2() {
101*67e74705SXin Li Write(x);
102*67e74705SXin Li }
103*67e74705SXin Li }
104*67e74705SXin Li
105*67e74705SXin Li namespace PR10270 {
106*67e74705SXin Li template<typename T> class C;
f()107*67e74705SXin Li template<typename T> void f() {
108*67e74705SXin Li if (C<T> == 1) // expected-error{{expected unqualified-id}}
109*67e74705SXin Li return;
110*67e74705SXin Li }
111*67e74705SXin Li }
112*67e74705SXin Li
113*67e74705SXin Li namespace rdar11806334 {
114*67e74705SXin Li
115*67e74705SXin Li class cc_YCbCr;
116*67e74705SXin Li
117*67e74705SXin Li class cc_rgb
118*67e74705SXin Li {
119*67e74705SXin Li public:
120*67e74705SXin Li cc_rgb( uint p ); // expected-error {{unknown type name}}
121*67e74705SXin Li cc_rgb( cc_YCbCr v_in );
122*67e74705SXin Li };
123*67e74705SXin Li
124*67e74705SXin Li class cc_hsl
125*67e74705SXin Li {
126*67e74705SXin Li public:
127*67e74705SXin Li cc_rgb rgb();
128*67e74705SXin Li cc_YCbCr YCbCr();
129*67e74705SXin Li };
130*67e74705SXin Li
131*67e74705SXin Li class cc_YCbCr
132*67e74705SXin Li {
133*67e74705SXin Li public:
134*67e74705SXin Li cc_YCbCr( const cc_rgb v_in );
135*67e74705SXin Li };
136*67e74705SXin Li
YCbCr()137*67e74705SXin Li cc_YCbCr cc_hsl::YCbCr()
138*67e74705SXin Li {
139*67e74705SXin Li cc_YCbCr v_out = cc_YCbCr( rgb());
140*67e74705SXin Li return v_out;
141*67e74705SXin Li }
142*67e74705SXin Li
143*67e74705SXin Li }
144*67e74705SXin Li
145*67e74705SXin Li namespace test1 {
146*67e74705SXin Li int getString(const int*);
147*67e74705SXin Li template<int a> class ELFObjectFile {
148*67e74705SXin Li const int* sh;
ELFObjectFile()149*67e74705SXin Li ELFObjectFile() {
150*67e74705SXin Li switch (*sh) {
151*67e74705SXin Li }
152*67e74705SXin Li int SectionName(getString(sh));
153*67e74705SXin Li }
154*67e74705SXin Li };
155*67e74705SXin Li }
156*67e74705SXin Li
157*67e74705SXin Li namespace test2 {
158*67e74705SXin Li struct fltSemantics ;
159*67e74705SXin Li const fltSemantics &foobar();
VisitCastExpr(int x)160*67e74705SXin Li void VisitCastExpr(int x) {
161*67e74705SXin Li switch (x) {
162*67e74705SXin Li case 42:
163*67e74705SXin Li const fltSemantics &Sem = foobar();
164*67e74705SXin Li }
165*67e74705SXin Li }
166*67e74705SXin Li }
167*67e74705SXin Li
168*67e74705SXin Li namespace test3 {
169*67e74705SXin Li struct nsCSSRect {
170*67e74705SXin Li };
171*67e74705SXin Li static int nsCSSRect::* sides;
172*67e74705SXin Li nsCSSRect dimenX;
ParseBoxCornerRadii(int y)173*67e74705SXin Li void ParseBoxCornerRadii(int y) {
174*67e74705SXin Li switch (y) {
175*67e74705SXin Li }
176*67e74705SXin Li int& x = dimenX.*sides;
177*67e74705SXin Li }
178*67e74705SXin Li }
179*67e74705SXin Li
180*67e74705SXin Li namespace pr16964 {
181*67e74705SXin Li template<typename> struct bs {
182*67e74705SXin Li bs();
183*67e74705SXin Li static int* member(); // expected-note{{possible target}}
184*67e74705SXin Li member(); // expected-error{{C++ requires a type specifier for all declarations}}
185*67e74705SXin Li static member(); // expected-error{{C++ requires a type specifier for all declarations}}
186*67e74705SXin Li static int* member(int); // expected-note{{possible target}}
187*67e74705SXin Li };
188*67e74705SXin Li
bs()189*67e74705SXin Li template<typename T> bs<T>::bs() { member; } // expected-error{{did you mean to call it}}
190*67e74705SXin Li
test()191*67e74705SXin Li bs<int> test() {
192*67e74705SXin Li return bs<int>(); // expected-note{{in instantiation}}
193*67e74705SXin Li }
194*67e74705SXin Li }
195*67e74705SXin Li
196*67e74705SXin Li namespace pr12791 {
197*67e74705SXin Li template<class _Alloc> class allocator {};
198*67e74705SXin Li template<class _CharT> struct char_traits;
199*67e74705SXin Li struct input_iterator_tag {};
200*67e74705SXin Li struct forward_iterator_tag : public input_iterator_tag {};
201*67e74705SXin Li
202*67e74705SXin Li template<typename _CharT, typename _Traits, typename _Alloc> struct basic_string {
203*67e74705SXin Li struct _Alloc_hider : _Alloc { _Alloc_hider(_CharT*, const _Alloc&); };
204*67e74705SXin Li mutable _Alloc_hider _M_dataplus;
205*67e74705SXin Li template<class _InputIterator> basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc());
206*67e74705SXin Li template<class _InIterator> static _CharT* _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a, input_iterator_tag);
207*67e74705SXin Li template<class _FwdIterator> static _CharT* _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a, forward_iterator_tag);
208*67e74705SXin Li static _CharT* _S_construct(size_type __req, _CharT __c, const _Alloc& __a); // expected-error{{unknown type name 'size_type'}}
209*67e74705SXin Li };
210*67e74705SXin Li
211*67e74705SXin Li template<typename _CharT, typename _Traits, typename _Alloc>
212*67e74705SXin Li template<typename _InputIterator>
basic_string(_InputIterator __beg,_InputIterator __end,const _Alloc & __a)213*67e74705SXin Li basic_string<_CharT, _Traits, _Alloc>:: basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
214*67e74705SXin Li : _M_dataplus(_S_construct(__beg, __end, __a, input_iterator_tag()), __a) {}
215*67e74705SXin Li
216*67e74705SXin Li template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > struct basic_stringbuf {
217*67e74705SXin Li typedef _CharT char_type;
218*67e74705SXin Li typedef basic_string<char_type, _Traits, _Alloc> __string_type;
strpr12791::basic_stringbuf219*67e74705SXin Li __string_type str() const {__string_type((char_type*)0,(char_type*)0);}
220*67e74705SXin Li };
221*67e74705SXin Li
222*67e74705SXin Li template class basic_stringbuf<char>;
223*67e74705SXin Li }
224*67e74705SXin Li
225*67e74705SXin Li namespace pr16989 {
226*67e74705SXin Li class C {
227*67e74705SXin Li template <class T>
tpl_mem(T *)228*67e74705SXin Li C tpl_mem(T *) { return } // expected-error{{expected expression}}
mem(int * p)229*67e74705SXin Li void mem(int *p) {
230*67e74705SXin Li tpl_mem(p);
231*67e74705SXin Li }
232*67e74705SXin Li };
233*67e74705SXin Li class C2 {
234*67e74705SXin Li void f();
235*67e74705SXin Li };
f()236*67e74705SXin Li void C2::f() {}
237*67e74705SXin Li }
238*67e74705SXin Li
239*67e74705SXin Li namespace pr20660 {
240*67e74705SXin Li appendList(int[]...); // expected-error {{C++ requires a type specifier for all declarations}}
appendList(int[]...)241*67e74705SXin Li appendList(int[]...) { } // expected-error {{C++ requires a type specifier for all declarations}}
242*67e74705SXin Li }
243*67e74705SXin Li
244