1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor
3d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregortemplate<typename T>
4d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregorstruct X0 {
5d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  template<typename U> T f0(U);
6d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  template<typename U> U& f1(T*, U); // expected-error{{pointer to a reference}} \
7d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor                                     // expected-note{{candidate}}
8d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor};
9d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor
10d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorX0<int> x0i;
11d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorX0<void> x0v;
12d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorX0<int&> x0ir; // expected-note{{instantiation}}
13d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor
14d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregorvoid test_X0(int *ip, double *dp) {
15d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  X0<int> xi;
16d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  int i1 = xi.f0(ip);
17d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  double *&dpr = xi.f1(ip, dp);
18d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  xi.f1(dp, dp); // expected-error{{no matching}}
19d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor
20d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  X0<void> xv;
21d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor  double *&dpr2 = xv.f1(ip, dp);
22d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor}
23d1102433214bd33b5bef5b493944292a1e82c2fbDouglas Gregor
24d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregortemplate<typename T>
25d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregorstruct X1 {
26d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  template<typename U>
27d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  struct Inner0 {
28d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor    U x;
29d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor    T y; // expected-error{{void}}
30d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  };
31d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor
32d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  template<typename U>
33d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  struct Inner1 {
34d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor    U x; // expected-error{{void}}
35357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor    T y;
36357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor  };
37357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor
38357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor  template<typename U>
39357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor  struct Inner2 {
40357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor    struct SuperInner {
41357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor      U z; // expected-error{{void}}
42357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor    };
43d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  };
445ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor
455ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  template<typename U>
465ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  struct Inner3 {
47a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor    void f0(T t, U u) { // expected-note{{passing argument to parameter 't' here}}
485ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor      (void)(t + u); // expected-error{{invalid operands}}
495ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor    }
505ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor
515ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor    template<typename V>
525ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor    V f1(T t, U u, V) {
5318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor      return t + u; // expected-error{{cannot initialize return object}}
545ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor    }
555ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  };
565ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor
578320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  template<typename U>
588320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  struct Inner4;
598320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor};
608320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor
618320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregortemplate<typename T>
628320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregortemplate<typename U>
638320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregorstruct X1<T>::Inner4 {
648320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  template<typename V>
658320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  V f2(T t, U u, V);
663cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor
673cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor  static U value;
68d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor};
69d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor
708320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregortemplate<typename T>
718320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregortemplate<typename U>
723cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas GregorU X1<T>::Inner4<U>::value; // expected-error{{reference variable}}
733cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor
743cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregortemplate<typename T>
753cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregortemplate<typename U>
768320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregortemplate<typename V>
778320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas GregorV X1<T>::Inner4<U>::f2(T t, U u, V) {
7818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  return t + u; // expected-error{{cannot initialize return object}}
798320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor}
808320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor
815ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregorvoid test_X1(int *ip, int i, double *dp) {
82d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  X1<void>::Inner0<int> *xvip; // okay
83d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  X1<void>::Inner0<int> xvi; // expected-note{{instantiation}}
84d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor
85d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  X1<int>::Inner1<void> *xivp; // okay
86d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor  X1<int>::Inner1<void> xiv; // expected-note{{instantiation}}
87357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor
88357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor  X1<int>::Inner2<void>::SuperInner *xisivp; // okay
89357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor  X1<int>::Inner2<void>::SuperInner xisiv; // expected-note{{instantiation}}
905ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor
915ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  X1<int*>::Inner3<int> id3;
925ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  id3.f0(ip, i);
93aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor  id3.f0(dp, i); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
945ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  id3.f1(ip, i, ip);
955ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  id3.f1(ip, i, dp); // expected-note{{instantiation}}
965ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor
975ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  X1<int*>::Inner3<double*> id3b;
985ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor  id3b.f0(ip, dp); // expected-note{{instantiation}}
998320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor
1008320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  X1<int*>::Inner4<int> id4;
1018320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor  id4.f2(ip, i, dp); // expected-note{{instantiation}}
1023cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor
1033cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor  X1<int*>::Inner4<int>::value = 17;
1043cd4d1ece34d36317ec5352855d86e256cb6aa27Douglas Gregor  i = X1<int*>::Inner4<int&>::value; // expected-note{{instantiation}}
105d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor}
10611a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor
10711a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor
10811a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregortemplate<typename T>
10911a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregorstruct X2 {
11011a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor  template<T *Ptr> // expected-error{{pointer to a reference}}
11111a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor  struct Inner;
11211a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor
11311a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor  template<T Value> // expected-error{{cannot have type 'float'}}
11411a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor  struct Inner2;
11511a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor};
11611a82401eaf3396dfb6466fa691a606204c8ddb0Douglas Gregor
11711a82401eaf3396dfb6466fa691a606204c8ddb0Douglas GregorX2<int&> x2a; // expected-note{{instantiation}}
11811a82401eaf3396dfb6466fa691a606204c8ddb0Douglas GregorX2<float> x2b; // expected-note{{instantiation}}
119699ee52b2f383b62865013c3575510b520055811Douglas Gregor
120699ee52b2f383b62865013c3575510b520055811Douglas Gregornamespace N0 {
121699ee52b2f383b62865013c3575510b520055811Douglas Gregor  template<typename T>
122699ee52b2f383b62865013c3575510b520055811Douglas Gregor  struct X0 { };
123699ee52b2f383b62865013c3575510b520055811Douglas Gregor
124699ee52b2f383b62865013c3575510b520055811Douglas Gregor  struct X1 {
125699ee52b2f383b62865013c3575510b520055811Douglas Gregor    template<typename T> void f(X0<T>& vals) { g(vals); }
126699ee52b2f383b62865013c3575510b520055811Douglas Gregor    template<typename T> void g(X0<T>& vals) { }
127699ee52b2f383b62865013c3575510b520055811Douglas Gregor  };
128699ee52b2f383b62865013c3575510b520055811Douglas Gregor
129699ee52b2f383b62865013c3575510b520055811Douglas Gregor  void test(X1 x1, X0<int> x0i, X0<long> x0l) {
130699ee52b2f383b62865013c3575510b520055811Douglas Gregor    x1.f(x0i);
131699ee52b2f383b62865013c3575510b520055811Douglas Gregor    x1.f(x0l);
132699ee52b2f383b62865013c3575510b520055811Douglas Gregor  }
133699ee52b2f383b62865013c3575510b520055811Douglas Gregor}
1348b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor
1358b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregornamespace PR6239 {
1368b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  template <typename T>
1378b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  struct X0 {
1388b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    class type {
1398b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor      typedef T E;
1408b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor      template <E e>  // subsitute T for E and bug goes away
1418b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor      struct sfinae {  };
1428b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor
1438b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor      template <class U>
1448b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor      typename sfinae<&U::operator=>::type test(int);
1458b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    };
1468b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  };
1478b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor
1488b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  template <typename T>
1498b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  struct X1 {
1508b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    typedef T E;
1518b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    template <E e>  // subsitute T for E and bug goes away
1528b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    struct sfinae {  };
1538b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor
1548b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    template <class U>
1558b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor    typename sfinae<&U::operator=>::type test(int);
1568b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor  };
1578b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor
1588b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor}
15924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
16024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregornamespace PR7587 {
16124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  template<typename> class X0;
16224bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  template<typename> struct X1;
16324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  template<typename> class X2;
16424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
16524bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  template<typename T> class X3
16624bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  {
16724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    template<
16824bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      template<typename> class TT,
16924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      typename U = typename X1<T>::type
17024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    >
17124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    struct Inner {
17224bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      typedef X2<TT<typename X1<T>::type> > Type;
17324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    };
17424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
17524bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    const typename Inner<X0>::Type minCoeff() const;
17624bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  };
17724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
17824bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  template<typename T> class X3<T*>
17924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  {
18024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    template<
18124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      template<typename> class TT,
18224bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      typename U = typename X1<T>::type
18324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    >
18424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    struct Inner {
18524bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor      typedef X2<TT<typename X1<T>::type> > Type;
18624bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    };
18724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
18824bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor    const typename Inner<X0>::Type minCoeff() const;
18924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  };
19024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor
19124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor}
19271b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor
19371b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregornamespace PR7669 {
19471b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor  template<class> struct X {
19571b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor    template<class> struct Y {
19671b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor      template<int,class> struct Z;
19771b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor      template<int Dummy> struct Z<Dummy,int> {};
19871b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor    };
19971b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor  };
20071b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor
20171b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor  void a()
20271b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor  {
20371b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor    X<int>::Y<int>::Z<0,int>();
20471b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor  }
20571b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor}
20661139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky
20761139c561f1a2c872209e32ff9143487cebf4324Nick Lewyckynamespace PR8489 {
20861139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky  template <typename CT>
20961139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky  class C {
21061139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky    template<typename FT>
21161139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky    void F() {} // expected-note{{FT}}
21261139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky  };
21361139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky  void f() {
21461139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky    C<int> c;
21561139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky    c.F(); // expected-error{{no matching member function}}
21661139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky  }
21761139c561f1a2c872209e32ff9143487cebf4324Nick Lewycky}
2180a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2190a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregornamespace rdar8986308 {
2200a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <bool> struct __static_assert_test;
2210a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <> struct __static_assert_test<true> {};
2220a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <unsigned> struct __static_assert_check {};
2230a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2240a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  namespace std {
2250a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2260a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    template <class _Tp, class _Up>
2270a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    struct __has_rebind
2280a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    {
2290a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    private:
2300a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor      struct __two {char _; char __;};
2310a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor      template <class _Xp> static __two __test(...);
2320a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor      template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
2330a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    public:
2340a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor      static const bool value = sizeof(__test<_Tp>(0)) == 1;
2350a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    };
2360a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2370a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  }
2380a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2390a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <class T> struct B1 {};
2400a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2410a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <class T>
2420a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  struct B
2430a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  {
2440a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    template <class U> struct rebind {typedef B1<U> other;};
2450a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  };
2460a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2470a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <class T, class U> struct D1 {};
2480a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2490a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  template <class T, class U>
2500a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  struct D
2510a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  {
2520a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    template <class V> struct rebind {typedef D1<V, U> other;};
2530a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  };
2540a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2550a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  int main()
2560a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  {
2570a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<B<int>, double>::value))>)> __t64;
2580a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor    typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<D<char, int>, double>::value))>)> __t64;
2590a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor  }
2600a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor
2610a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor}
262