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