1abea951c34876a5374d0e3678c7989b225c5c895Anders Carlsson// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 2d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 3d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor// --------------------------------------------------------------------- 4d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor// C++ Functional Casts 5d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor// --------------------------------------------------------------------- 6d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate<int N> 7d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregorstruct ValueInit0 { 8d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor int f() { 9d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor return int(); 10d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor } 11d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor}; 12d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 13d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate struct ValueInit0<5>; 14d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 15d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate<int N> 16d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregorstruct FunctionalCast0 { 17d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor int f() { 18d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor return int(N); 19d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor } 20d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor}; 21d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 22d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate struct FunctionalCast0<5>; 23d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 24220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct X { // expected-note 3 {{candidate constructor (the implicit copy constructor)}} 25b1622a1fd7b7f4ab8d00d0183d17c90ad25c14e3John McCall X(int, int); // expected-note 3 {{candidate constructor}} 26d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor}; 27d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 28d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate<int N, int M> 29d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregorstruct BuildTemporary0 { 30d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor X f() { 31d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor return X(N, M); 32d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor } 33d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor}; 34d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor 35d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregortemplate struct BuildTemporary0<5, 7>; 36e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor 37e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregortemplate<int N, int M> 38e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregorstruct Temporaries0 { 39e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor void f() { 40e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor (void)X(N, M); 41e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor } 42e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor}; 43e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregor 44e06274d5c5c6b2decc9f217a8913b28f846bfcfaDouglas Gregortemplate struct Temporaries0<5, 7>; 453433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 46a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth// Ensure that both the constructor and the destructor are instantiated by 47a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth// checking for parse errors from each. 48a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruthtemplate<int N> struct BadX { 49b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth BadX() { int a[-N]; } // expected-error {{array with a negative size}} 50b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth ~BadX() { int a[-N]; } // expected-error {{array with a negative size}} 51a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth}; 52a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth 53a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruthtemplate<int N> 54a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruthstruct PR6671 { 55a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth void f() { (void)BadX<1>(); } // expected-note 2 {{instantiation}} 56a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth}; 57a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruthtemplate struct PR6671<1>; 58a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth 593433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor// --------------------------------------------------------------------- 60d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor// new/delete expressions 613433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor// --------------------------------------------------------------------- 623433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregorstruct Y { }; 633433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 643433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate<typename T> 653433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregorstruct New0 { 663433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor T* f(bool x) { 673433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor if (x) 683433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor return new T; // expected-error{{no matching}} 693433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor else 703433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor return new T(); 713433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor } 723433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor}; 733433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 743433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New0<int>; 753433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New0<Y>; 763433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New0<X>; // expected-note{{instantiation}} 773433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 783433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate<typename T, typename Arg1> 793433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregorstruct New1 { 803433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor T* f(bool x, Arg1 a1) { 813433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor return new T(a1); // expected-error{{no matching}} 823433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor } 833433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor}; 843433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 853433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New1<int, float>; 863433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New1<Y, Y>; 873433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New1<X, Y>; // expected-note{{instantiation}} 883433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 893433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate<typename T, typename Arg1, typename Arg2> 903433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregorstruct New2 { 913433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor T* f(bool x, Arg1 a1, Arg2 a2) { 923433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor return new T(a1, a2); // expected-error{{no matching}} 933433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor } 943433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor}; 953433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor 963433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New2<X, int, float>; 973433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregortemplate struct New2<X, int, int*>; // expected-note{{instantiation}} 983433cf7dfda405bf51bba914a338adf645a87e3bDouglas Gregor// FIXME: template struct New2<int, int, float>; 99d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor 1005b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor// PR5833 1015b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregorstruct New3 { 1025b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor New3(); 1035b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor 1045b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor void *operator new[](__SIZE_TYPE__) __attribute__((unavailable)); // expected-note{{explicitly made unavailable}} 1055b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor}; 1065b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor 1075b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregortemplate<class C> 1085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregorvoid* object_creator() { 1095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor return new C(); // expected-error{{call to unavailable function 'operator new[]'}} 1105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor} 1115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor 1125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregortemplate void *object_creator<New3[4]>(); // expected-note{{instantiation}} 1135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor 114d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregortemplate<typename T> 115d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregorstruct Delete0 { 116d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor void f(T t) { 117d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor delete t; // expected-error{{cannot delete}} 1187114cbab7eb6e8b714eb22f014327daf2c741c08John McCall ::delete [] t; // expected-error{{cannot delete}} 119d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor } 120d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor}; 121d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregor 122d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregortemplate struct Delete0<int*>; 123d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregortemplate struct Delete0<X*>; 124d0c02674e32cea54e386a52094f89abb71b274daDouglas Gregortemplate struct Delete0<int>; // expected-note{{instantiation}} 12542e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 126a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregornamespace PR5755 { 127a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor template <class T> 128a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor void Foo() { 129a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor char* p = 0; 130a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor delete[] p; 131a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor } 132a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor 133a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor void Test() { 134a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor Foo<int>(); 135a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor } 136a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor} 137a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor 1382ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregornamespace PR10480 { 1392ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor template<typename T> 1402ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor struct X { 1412ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor X(); 1422ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor ~X() { 1432ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor T *ptr = 1; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} 1442ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor } 1452ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor }; 1462ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor 1472ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor template<typename T> 1482ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor void f() { 1492ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor new X<int>[1]; // expected-note{{in instantiation of member function 'PR10480::X<int>::~X' requested here}} 1502ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor } 1512ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor 1522ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor template void f<int>(); 1532ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor} 1542ad63cf7146268a336b5a931f626adaa8a5150f0Douglas Gregor 15542e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor// --------------------------------------------------------------------- 15642e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor// throw expressions 15742e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor// --------------------------------------------------------------------- 15842e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregortemplate<typename T> 15942e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregorstruct Throw1 { 16042e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor void f(T t) { 16142e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor throw; 16242e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor throw t; // expected-error{{incomplete type}} 16342e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor } 16442e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor}; 16542e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 166765ccba920269eefbf572ec4bcd6ac7b6e9f9f77Douglas Gregorstruct Incomplete; // expected-note 2{{forward}} 16742e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 16842e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregortemplate struct Throw1<int>; 16942e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregortemplate struct Throw1<int*>; 17042e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregortemplate struct Throw1<Incomplete*>; // expected-note{{instantiation}} 17142e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 17212d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor// --------------------------------------------------------------------- 17312d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor// typeid expressions 17412d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor// --------------------------------------------------------------------- 17512d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor 17612d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregornamespace std { 17712d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor class type_info; 17812d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor} 17912d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor 18012d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregortemplate<typename T> 18112d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregorstruct TypeId0 { 18212d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor const std::type_info &f(T* ptr) { 18312d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor if (ptr) 18412d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor return typeid(ptr); 18512d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor else 1867c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall return typeid(T); // expected-error{{'typeid' of incomplete type 'Incomplete'}} 18712d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor } 18812d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor}; 18912d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor 19012d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregorstruct Abstract { 19112d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor virtual void f() = 0; 19212d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor}; 19312d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregor 19412d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregortemplate struct TypeId0<int>; 195765ccba920269eefbf572ec4bcd6ac7b6e9f9f77Douglas Gregortemplate struct TypeId0<Incomplete>; // expected-note{{instantiation of member function}} 19612d0c307369e4a523e2e40025bf124c310f98dffDouglas Gregortemplate struct TypeId0<Abstract>; 19736bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor 19836bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor// --------------------------------------------------------------------- 19936bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor// type traits 20036bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor// --------------------------------------------------------------------- 20136bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregortemplate<typename T> 20236bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregorstruct is_pod { 20336bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor static const bool value = __is_pod(T); 20436bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor}; 20536bb03b86ab6f905b336ee9ec11f288291b22b45Douglas Gregor 20660c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregorstatic int is_pod0[is_pod<X>::value? -1 : 1]; 20760c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregorstatic int is_pod1[is_pod<Y>::value? 1 : -1]; 208ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor 209ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor// --------------------------------------------------------------------- 210ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor// initializer lists 211ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor// --------------------------------------------------------------------- 212ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate<typename T, typename Val1> 213ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregorstruct InitList1 { 214ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor void f(Val1 val1) { 215ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor T x = { val1 }; 216ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor } 217ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor}; 218ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor 219ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregorstruct APair { 220ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor int *x; 221ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor const float *y; 222ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor}; 223ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor 224ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate struct InitList1<int[1], float>; 225ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate struct InitList1<APair, int*>; 226ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor 227ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate<typename T, typename Val1, typename Val2> 228ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregorstruct InitList2 { 229ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor void f(Val1 val1, Val2 val2) { 2302bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson T x = { val1, val2 }; // expected-error{{cannot initialize}} 231ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor } 232ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor}; 233ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregor 234ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate struct InitList2<APair, int*, float*>; 235ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3Douglas Gregortemplate struct InitList2<APair, int*, double*>; // expected-note{{instantiation}} 2361c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2371c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor// --------------------------------------------------------------------- 2381c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor// member references 2391c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor// --------------------------------------------------------------------- 2401c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate<typename T, typename Result> 2411c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct DotMemRef0 { 2421c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor void f(T t) { 24320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result result = t.m; // expected-error{{non-const lvalue reference to type}} 2441c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 2451c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 2461c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2471c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct MemInt { 2481c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor int m; 2491c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 2501c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2511c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct InheritsMemInt : MemInt { }; 2521c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2531c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct MemIntFunc { 2541c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor static int m(int); 2551c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 2561c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2571c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct DotMemRef0<MemInt, int&>; 2581c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct DotMemRef0<InheritsMemInt, int&>; 2591c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct DotMemRef0<MemIntFunc, int (*)(int)>; 2601c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct DotMemRef0<MemInt, float&>; // expected-note{{instantiation}} 2611c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2621c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate<typename T, typename Result> 2631c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct ArrowMemRef0 { 2641c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor void f(T t) { 26520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result result = t->m; // expected-error 2{{non-const lvalue reference}} 2661c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 2671c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 2681c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2691c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate<typename T> 2701c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct ArrowWrapper { 2711c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor T operator->(); 2721c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 2731c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2741c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<MemInt*, int&>; 2751c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<InheritsMemInt*, int&>; 2761c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<MemIntFunc*, int (*)(int)>; 2771c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<MemInt*, float&>; // expected-note{{instantiation}} 2781c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2791c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<ArrowWrapper<MemInt*>, int&>; 2801c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<ArrowWrapper<InheritsMemInt*>, int&>; 2811c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<ArrowWrapper<MemIntFunc*>, int (*)(int)>; 2821c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}} 2831c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>; 2841c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 28531161c79edf73035ac36007f6ad935d61340dc51Richard Smithstruct UnresolvedMemRefArray { 28631161c79edf73035ac36007f6ad935d61340dc51Richard Smith int f(int); 28731161c79edf73035ac36007f6ad935d61340dc51Richard Smith int f(char); 28831161c79edf73035ac36007f6ad935d61340dc51Richard Smith}; 28931161c79edf73035ac36007f6ad935d61340dc51Richard SmithUnresolvedMemRefArray Arr[10]; 29031161c79edf73035ac36007f6ad935d61340dc51Richard Smithtemplate<typename U> int UnresolvedMemRefArrayT(U u) { 29131161c79edf73035ac36007f6ad935d61340dc51Richard Smith return Arr->f(u); 29231161c79edf73035ac36007f6ad935d61340dc51Richard Smith} 29331161c79edf73035ac36007f6ad935d61340dc51Richard Smithtemplate int UnresolvedMemRefArrayT<int>(int); 29431161c79edf73035ac36007f6ad935d61340dc51Richard Smith 2951c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor// FIXME: we should be able to return a MemInt without the reference! 2961c0ca59416999129d0439c2661d137ef38e86209Douglas GregorMemInt &createMemInt(int); 2971c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2981c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate<int N> 2991c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorstruct NonDepMemberExpr0 { 3001c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor void f() { 3011c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor createMemInt(N).m = N; 3021c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 3031c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 3041c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3051c0ca59416999129d0439c2661d137ef38e86209Douglas Gregortemplate struct NonDepMemberExpr0<0>; 30608d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 30708d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate<typename T, typename Result> 30808d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregorstruct MemberFuncCall0 { 30908d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor void f(T t) { 31008d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor Result result = t.f(); 31108d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor } 31208d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor}; 31308d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 31408d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate<typename T> 31508d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregorstruct HasMemFunc0 { 31608d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor T f(); 31708d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor}; 31808d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 31908d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 32008d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate struct MemberFuncCall0<HasMemFunc0<int&>, const int&>; 32108d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 32208d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate<typename Result> 32308d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregorstruct ThisMemberFuncCall0 { 32408d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor Result g(); 32508d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 32608d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor void f() { 32708d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor Result r1 = g(); 32808d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor Result r2 = this->g(); 32908d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor } 33008d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor}; 33108d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 33208d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate struct ThisMemberFuncCall0<int&>; 33308d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 33408d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate<typename T> 33508d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregorstruct NonDepMemberCall0 { 33608d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor void foo(HasMemFunc0<int&> x) { 33720093b4bf698f292c664676987541d5103b65b15Douglas Gregor T result = x.f(); // expected-error{{non-const lvalue reference}} 33808d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor } 33908d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor}; 34008d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregor 34108d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate struct NonDepMemberCall0<int&>; 34208d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate struct NonDepMemberCall0<const int&>; 34308d3e7c9ccbed9b26c301390d5997871b2dd41b7Douglas Gregortemplate struct NonDepMemberCall0<float&>; // expected-note{{instantiation}} 344e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor 345e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor 346e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregortemplate<typename T> 347e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregorstruct QualifiedDeclRef0 { 348e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor T f() { 34958f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner return is_pod<X>::value; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'const bool'}} 350e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor } 351e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor}; 352e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregor 353e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregortemplate struct QualifiedDeclRef0<bool>; 354e30d0bdda24708e9a667722a56b9c96153fe8b4dDouglas Gregortemplate struct QualifiedDeclRef0<int&>; // expected-note{{instantiation}} 355