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