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