1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregortemplate<typename T, int N = 2> struct X; // expected-note{{template is declared here}}
362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
462cb18dd11472965e03374d40bc27d650bc331b6Douglas GregorX<int, 1> *x1;
562cb18dd11472965e03374d40bc27d650bc331b6Douglas GregorX<int> *x2;
662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
739a8de10c18365bde7062d8959b7ed525449c561Douglas GregorX<> *x3; // expected-error{{too few template arguments for class template 'X'}}
862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregortemplate<typename U = float, int M> struct X;
1062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
1162cb18dd11472965e03374d40bc27d650bc331b6Douglas GregorX<> *x4;
129bff9a91fbd6213e2d042aadd8ede92bed6be666Anders Carlsson
13f4e2a2ce1101d875c4b69294416438007947daebAnders Carlssontemplate<typename T = int> struct Z { };
149bff9a91fbd6213e2d042aadd8ede92bed6be666Anders Carlssontemplate struct Z<>;
153b56c002591b59c6c257951f6613b44de83fa860Anders Carlsson
163b56c002591b59c6c257951f6613b44de83fa860Anders Carlsson// PR4362
173b56c002591b59c6c257951f6613b44de83fa860Anders Carlssontemplate<class T> struct a { };
183b56c002591b59c6c257951f6613b44de83fa860Anders Carlssontemplate<> struct a<int> { static const bool v = true; };
193b56c002591b59c6c257951f6613b44de83fa860Anders Carlsson
203b56c002591b59c6c257951f6613b44de83fa860Anders Carlssontemplate<class T, bool = a<T>::v> struct p { }; // expected-error {{no member named 'v'}}
213b56c002591b59c6c257951f6613b44de83fa860Anders Carlsson
223b56c002591b59c6c257951f6613b44de83fa860Anders Carlssontemplate struct p<bool>; // expected-note {{in instantiation of default argument for 'p<bool>' required here}}
233b56c002591b59c6c257951f6613b44de83fa860Anders Carlssontemplate struct p<int>;
24542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor
25542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor// PR5187
26542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregortemplate<typename T, typename U>
27542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregorstruct A;
28542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor
29542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregortemplate<typename T, typename U = T>
30542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregorstruct A;
31542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor
32542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregortemplate<typename T, typename U>
33542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregorstruct A {
34542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor  void f(A<T>);
35542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor};
36542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor
37542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregortemplate<typename T>
38542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregorstruct B { };
39542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor
40542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregortemplate<>
41542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregorstruct B<void> {
42542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor  typedef B<void*> type;
43542b548e041a6fab0fe06601ccc6b91a81bc217aDouglas Gregor};
440f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
450f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor// Nested default arguments for template parameters.
460f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregortemplate<typename T> struct X1 { };
470f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
480f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregortemplate<typename T>
490f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregorstruct X2 {
509d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template<typename U = typename X1<T>::type> // expected-error{{no type named 'type' in 'X1<int>'}} \
519d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer                                              // expected-error{{no type named 'type' in 'X1<char>'}}
529d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  struct Inner1 { }; // expected-note{{template is declared here}}
530f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
549d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template<T Value = X1<T>::value> // expected-error{{no member named 'value' in 'X1<int>'}} \
559d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer                                   // expected-error{{no member named 'value' in 'X1<char>'}}
569d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  struct NonType1 { }; // expected-note{{template is declared here}}
570f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
580f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor  template<T Value>
590f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor  struct Inner2 { };
600f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
610f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor  template<typename U>
620f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor  struct Inner3 {
630f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor    template<typename X = T, typename V = U>
640f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor    struct VeryInner { };
650f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
660f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor    template<T Value1 = sizeof(T), T Value2 = sizeof(U),
670f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor             T Value3 = Value1 + Value2>
680f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor    struct NonType2 { };
690f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor  };
700f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor};
710f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
729d57b8dea3b139dc2e2976ffccef50c74ac03873David MajnemerX2<int> x2i; // expected-note{{in instantiation of template class 'X2<int>' requested here}}
730f8716b7bb25d61a82f699b3975167451f7b5a68Douglas GregorX2<int>::Inner1<float> x2iif;
740f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
759d57b8dea3b139dc2e2976ffccef50c74ac03873David MajnemerX2<int>::Inner1<> x2bad; // expected-error{{too few template arguments for class template 'Inner1'}}
760f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
770f8716b7bb25d61a82f699b3975167451f7b5a68Douglas GregorX2<int>::NonType1<'a'> x2_nontype1;
789d57b8dea3b139dc2e2976ffccef50c74ac03873David MajnemerX2<int>::NonType1<> x2_nontype1_bad; // expected-error{{too few template arguments for class template 'NonType1'}}
790f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
800f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor// Check multi-level substitution into template type arguments
810f8716b7bb25d61a82f699b3975167451f7b5a68Douglas GregorX2<int>::Inner3<float>::VeryInner<> vi;
829d57b8dea3b139dc2e2976ffccef50c74ac03873David MajnemerX2<char>::Inner3<int>::NonType2<> x2_deep_nontype; // expected-note{{in instantiation of template class 'X2<char>' requested here}}
830f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
840f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregortemplate<typename T, typename U>
850f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregorstruct is_same { static const bool value = false; };
860f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
870f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregortemplate<typename T>
880f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregorstruct is_same<T, T> { static const bool value = true; };
890f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
907bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregorint array1[is_same<__typeof__(vi),
910f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor               X2<int>::Inner3<float>::VeryInner<int, float> >::value? 1 : -1];
920f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor
937bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregorint array2[is_same<__typeof(x2_deep_nontype),
947bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor                   X2<char>::Inner3<int>::NonType2<sizeof(char), sizeof(int),
950f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor                                    sizeof(char)+sizeof(int)> >::value? 1 : -1];
967bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor
977bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor// Template template parameter defaults
987bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregortemplate<template<typename T> class X = X2> struct X3 { };
997bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregorint array3[is_same<X3<>, X3<X2> >::value? 1 : -1];
1007bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor
1017bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregorstruct add_pointer {
1027bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor  template<typename T>
1037bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor  struct apply {
1047bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor    typedef T* type;
1057bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor  };
1067bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor};
1077bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor
1087bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregortemplate<typename T, template<typename> class X = T::template apply>
1097bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor  struct X4;
1107bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregorint array4[is_same<X4<add_pointer>,
1117bb87fca7d22a8a194d04188746b90f46512975fDouglas Gregor                   X4<add_pointer, add_pointer::apply> >::value? 1 : -1];
1129148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor
1139148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregortemplate<int> struct X5 {}; // expected-note{{has a different type 'int'}}
1149148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregortemplate<long> struct X5b {};
1159148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregortemplate<typename T,
1169148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor         template<T> class B = X5> // expected-error{{template template argument has different}} \
1179148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor                                   // expected-note{{previous non-type template parameter}}
1189148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor  struct X6 {};
1199148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor
1209148c3f5829f4d031249faeb1043e7be914539e8Douglas GregorX6<int> x6a;
121f35f828f9883123772a9731af190a608f3236ef4Douglas GregorX6<long> x6b; // expected-note{{while checking a default template argument}}
1229148c3f5829f4d031249faeb1043e7be914539e8Douglas GregorX6<long, X5b> x6c;
123eaf75f4e0f65444bb122ade7725a4a32badcbf77Douglas Gregor
124eaf75f4e0f65444bb122ade7725a4a32badcbf77Douglas Gregor
125eaf75f4e0f65444bb122ade7725a4a32badcbf77Douglas Gregortemplate<template<class> class X = B<int> > struct X7; // expected-error{{must be a class template}}
126383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor
127383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregornamespace PR9643 {
128383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  template<typename T> class allocator {};
129383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  template<typename T, typename U = allocator<T> > class vector {};
130383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor
131383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  template<template<typename U, typename = allocator<U> > class container,
132383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor           typename DT>
133383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  container<DT> initializer(const DT& d) {
134383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor    return container<DT>();
135383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  }
136383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor
137383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  void f() {
138383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor    vector<int, allocator<int> > v = initializer<vector>(5);
139383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor  }
140383041d31ca14cdf87865ccac6e6f9821d40f61aDouglas Gregor}
14103c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith
14203c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smithnamespace PR16288 {
14303c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  template<typename X>
14403c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  struct S {
14503c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith    template<typename T = int, typename U> // expected-warning {{C++11}}
14603c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith    void f();
14703c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  };
14803c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  template<typename X>
14903c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  template<typename T, typename U>
15003c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith  void S<X>::f() {}
15103c55be552d224c787c3dd2e981b47a23b05cc2dRichard Smith}
1529d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
1539d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemernamespace DR1635 {
1549d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template <class T> struct X {
1559d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer    template <class U = typename T::type> static void f(int) {} // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} \
1569d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer                                                                // expected-warning {{C++11}}
1579d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer    static void f(...) {}
1589d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  };
1599d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
1609d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  int g() { X<int>::f(0); } // expected-note {{in instantiation of template class 'DR1635::X<int>' requested here}}
1619d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer}
162