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