instantiate-member-template.cpp revision 3cd4d1ece34d36317ec5352855d86e256cb6aa27
1d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor// RUN: clang-cc -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 { 475ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor void f0(T t, U u) { 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) { 535ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor return t + u; // expected-error{{incompatible type}} 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) { 788320ad400439def135a75aa1dd0cafbcc1c9e5e0Douglas Gregor return t + u; // expected-error{{incompatible type}} 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); 935ec178ff237d77e7acf5e747c19bf4f2de77a779Douglas Gregor id3.f0(dp, i); // expected-error{{incompatible type}} 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} 106