1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 2 3 // --------------------------------------------------------------------- 4 // C++ Functional Casts 5 // --------------------------------------------------------------------- 6 template<int N> 7 struct ValueInit0 { 8 int f() { 9 return int(); 10 } 11 }; 12 13 template struct ValueInit0<5>; 14 15 template<int N> 16 struct FunctionalCast0 { 17 int f() { 18 return int(N); 19 } 20 }; 21 22 template struct FunctionalCast0<5>; 23 24 struct X { // expected-note 3 {{candidate constructor (the implicit copy constructor)}} 25 X(int, int); // expected-note 3 {{candidate constructor}} 26 }; 27 28 template<int N, int M> 29 struct BuildTemporary0 { 30 X f() { 31 return X(N, M); 32 } 33 }; 34 35 template struct BuildTemporary0<5, 7>; 36 37 template<int N, int M> 38 struct Temporaries0 { 39 void f() { 40 (void)X(N, M); 41 } 42 }; 43 44 template struct Temporaries0<5, 7>; 45 46 // Ensure that both the constructor and the destructor are instantiated by 47 // checking for parse errors from each. 48 template<int N> struct BadX { 49 BadX() { int a[-N]; } // expected-error {{array with a negative size}} 50 ~BadX() { int a[-N]; } // expected-error {{array with a negative size}} 51 }; 52 53 template<int N> 54 struct PR6671 { 55 void f() { (void)BadX<1>(); } // expected-note 2 {{instantiation}} 56 }; 57 template struct PR6671<1>; 58 59 // --------------------------------------------------------------------- 60 // new/delete expressions 61 // --------------------------------------------------------------------- 62 struct Y { }; 63 64 template<typename T> 65 struct New0 { 66 T* f(bool x) { 67 if (x) 68 return new T; // expected-error{{no matching}} 69 else 70 return new T(); 71 } 72 }; 73 74 template struct New0<int>; 75 template struct New0<Y>; 76 template struct New0<X>; // expected-note{{instantiation}} 77 78 template<typename T, typename Arg1> 79 struct New1 { 80 T* f(bool x, Arg1 a1) { 81 return new T(a1); // expected-error{{no matching}} 82 } 83 }; 84 85 template struct New1<int, float>; 86 template struct New1<Y, Y>; 87 template struct New1<X, Y>; // expected-note{{instantiation}} 88 89 template<typename T, typename Arg1, typename Arg2> 90 struct New2 { 91 T* f(bool x, Arg1 a1, Arg2 a2) { 92 return new T(a1, a2); // expected-error{{no matching}} 93 } 94 }; 95 96 template struct New2<X, int, float>; 97 template struct New2<X, int, int*>; // expected-note{{instantiation}} 98 // FIXME: template struct New2<int, int, float>; 99 100 // PR5833 101 struct New3 { 102 New3(); 103 104 void *operator new[](__SIZE_TYPE__) __attribute__((unavailable)); // expected-note{{explicitly made unavailable}} 105 }; 106 107 template<class C> 108 void* object_creator() { 109 return new C(); // expected-error{{call to unavailable function 'operator new[]'}} 110 } 111 112 template void *object_creator<New3[4]>(); // expected-note{{instantiation}} 113 114 template<typename T> 115 struct Delete0 { 116 void f(T t) { 117 delete t; // expected-error{{cannot delete}} 118 ::delete [] t; // expected-error{{cannot delete}} 119 } 120 }; 121 122 template struct Delete0<int*>; 123 template struct Delete0<X*>; 124 template struct Delete0<int>; // expected-note{{instantiation}} 125 126 namespace PR5755 { 127 template <class T> 128 void Foo() { 129 char* p = 0; 130 delete[] p; 131 } 132 133 void Test() { 134 Foo<int>(); 135 } 136 } 137 138 // --------------------------------------------------------------------- 139 // throw expressions 140 // --------------------------------------------------------------------- 141 template<typename T> 142 struct Throw1 { 143 void f(T t) { 144 throw; 145 throw t; // expected-error{{incomplete type}} 146 } 147 }; 148 149 struct Incomplete; // expected-note 2{{forward}} 150 151 template struct Throw1<int>; 152 template struct Throw1<int*>; 153 template struct Throw1<Incomplete*>; // expected-note{{instantiation}} 154 155 // --------------------------------------------------------------------- 156 // typeid expressions 157 // --------------------------------------------------------------------- 158 159 namespace std { 160 class type_info; 161 } 162 163 template<typename T> 164 struct TypeId0 { 165 const std::type_info &f(T* ptr) { 166 if (ptr) 167 return typeid(ptr); 168 else 169 return typeid(T); // expected-error{{'typeid' of incomplete type 'Incomplete'}} 170 } 171 }; 172 173 struct Abstract { 174 virtual void f() = 0; 175 }; 176 177 template struct TypeId0<int>; 178 template struct TypeId0<Incomplete>; // expected-note{{instantiation of member function}} 179 template struct TypeId0<Abstract>; 180 181 // --------------------------------------------------------------------- 182 // type traits 183 // --------------------------------------------------------------------- 184 template<typename T> 185 struct is_pod { 186 static const bool value = __is_pod(T); 187 }; 188 189 static int is_pod0[is_pod<X>::value? -1 : 1]; 190 static int is_pod1[is_pod<Y>::value? 1 : -1]; 191 192 // --------------------------------------------------------------------- 193 // initializer lists 194 // --------------------------------------------------------------------- 195 template<typename T, typename Val1> 196 struct InitList1 { 197 void f(Val1 val1) { 198 T x = { val1 }; 199 } 200 }; 201 202 struct APair { 203 int *x; 204 const float *y; 205 }; 206 207 template struct InitList1<int[1], float>; 208 template struct InitList1<APair, int*>; 209 210 template<typename T, typename Val1, typename Val2> 211 struct InitList2 { 212 void f(Val1 val1, Val2 val2) { 213 T x = { val1, val2 }; // expected-error{{cannot initialize}} 214 } 215 }; 216 217 template struct InitList2<APair, int*, float*>; 218 template struct InitList2<APair, int*, double*>; // expected-note{{instantiation}} 219 220 // --------------------------------------------------------------------- 221 // member references 222 // --------------------------------------------------------------------- 223 template<typename T, typename Result> 224 struct DotMemRef0 { 225 void f(T t) { 226 Result result = t.m; // expected-error{{non-const lvalue reference to type}} 227 } 228 }; 229 230 struct MemInt { 231 int m; 232 }; 233 234 struct InheritsMemInt : MemInt { }; 235 236 struct MemIntFunc { 237 static int m(int); 238 }; 239 240 template struct DotMemRef0<MemInt, int&>; 241 template struct DotMemRef0<InheritsMemInt, int&>; 242 template struct DotMemRef0<MemIntFunc, int (*)(int)>; 243 template struct DotMemRef0<MemInt, float&>; // expected-note{{instantiation}} 244 245 template<typename T, typename Result> 246 struct ArrowMemRef0 { 247 void f(T t) { 248 Result result = t->m; // expected-error 2{{non-const lvalue reference}} 249 } 250 }; 251 252 template<typename T> 253 struct ArrowWrapper { 254 T operator->(); 255 }; 256 257 template struct ArrowMemRef0<MemInt*, int&>; 258 template struct ArrowMemRef0<InheritsMemInt*, int&>; 259 template struct ArrowMemRef0<MemIntFunc*, int (*)(int)>; 260 template struct ArrowMemRef0<MemInt*, float&>; // expected-note{{instantiation}} 261 262 template struct ArrowMemRef0<ArrowWrapper<MemInt*>, int&>; 263 template struct ArrowMemRef0<ArrowWrapper<InheritsMemInt*>, int&>; 264 template struct ArrowMemRef0<ArrowWrapper<MemIntFunc*>, int (*)(int)>; 265 template struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}} 266 template struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>; 267 268 // FIXME: we should be able to return a MemInt without the reference! 269 MemInt &createMemInt(int); 270 271 template<int N> 272 struct NonDepMemberExpr0 { 273 void f() { 274 createMemInt(N).m = N; 275 } 276 }; 277 278 template struct NonDepMemberExpr0<0>; 279 280 template<typename T, typename Result> 281 struct MemberFuncCall0 { 282 void f(T t) { 283 Result result = t.f(); 284 } 285 }; 286 287 template<typename T> 288 struct HasMemFunc0 { 289 T f(); 290 }; 291 292 293 template struct MemberFuncCall0<HasMemFunc0<int&>, const int&>; 294 295 template<typename Result> 296 struct ThisMemberFuncCall0 { 297 Result g(); 298 299 void f() { 300 Result r1 = g(); 301 Result r2 = this->g(); 302 } 303 }; 304 305 template struct ThisMemberFuncCall0<int&>; 306 307 template<typename T> 308 struct NonDepMemberCall0 { 309 void foo(HasMemFunc0<int&> x) { 310 T result = x.f(); // expected-error{{non-const lvalue reference}} 311 } 312 }; 313 314 template struct NonDepMemberCall0<int&>; 315 template struct NonDepMemberCall0<const int&>; 316 template struct NonDepMemberCall0<float&>; // expected-note{{instantiation}} 317 318 319 template<typename T> 320 struct QualifiedDeclRef0 { 321 T f() { 322 return is_pod<X>::value; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'const bool'}} 323 } 324 }; 325 326 template struct QualifiedDeclRef0<bool>; 327 template struct QualifiedDeclRef0<int&>; // expected-note{{instantiation}} 328