typename-specifier-4.cpp revision a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3d
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 26946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename T, typename U> 36946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct is_same { 46946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor static const bool value = false; 56946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 66946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 76946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename T> 86946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct is_same<T, T> { 96946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor static const bool value = true; 106946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 116946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 126946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename MetaFun, typename T1, typename T2> 136946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct metafun_apply2 { 146946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typedef typename MetaFun::template apply<T1, T2> inner; 156946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typedef typename inner::type type; 166946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 176946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 186946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename T, typename U> struct pair; 196946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 206946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct make_pair { 216946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor template<typename T1, typename T2> 226946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor struct apply { 236946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typedef pair<T1, T2> type; 246946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor }; 256946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 266946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 276946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorint a0[is_same<metafun_apply2<make_pair, int, float>::type, 286946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor pair<int, float> >::value? 1 : -1]; 296946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorint a1[is_same< 306946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typename make_pair::template apply<int, float>, 316946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor make_pair::apply<int, float> 326946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor >::value? 1 : -1]; 336946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 346946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename MetaFun> 356946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct swap_and_apply2 { 366946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor template<typename T1, typename T2> 376946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor struct apply { 386946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typedef typename MetaFun::template apply<T2, T1> new_metafun; 396946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor typedef typename new_metafun::type type; 406946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor }; 416946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 426946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 436946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorint a2[is_same<swap_and_apply2<make_pair>::apply<int, float>::type, 446946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor pair<float, int> >::value? 1 : -1]; 456946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 46ae4406744024feee732cb8742572377e9646cd5bDouglas Gregortemplate<typename MetaFun> 47ae4406744024feee732cb8742572377e9646cd5bDouglas Gregorstruct swap_and_apply2b { 48ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor template<typename T1, typename T2> 49ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor struct apply { 50ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor typedef typename MetaFun::template apply<T2, T1>::type type; 51ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor }; 52ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor}; 53ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor 54ae4406744024feee732cb8742572377e9646cd5bDouglas Gregorint a3[is_same<swap_and_apply2b<make_pair>::apply<int, float>::type, 55ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor pair<float, int> >::value? 1 : -1]; 56ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor 576946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename T> 586946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct X0 { 596946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor template<typename U, typename V> 606946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor struct Inner; 616946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 626946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f0(X0<T>::Inner<T*, T&>); // expected-note{{here}} 636946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f0(typename X0<T>::Inner<T*, T&>); // expected-error{{redecl}} 646946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 656946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f1(X0<T>::Inner<T*, T&>); // expected-note{{here}} 666946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f1(typename X0<T>::template Inner<T*, T&>); // expected-error{{redecl}} 67ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor 68ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor void f2(typename X0<T>::Inner<T*, T&>::type); // expected-note{{here}} 69ae4406744024feee732cb8742572377e9646cd5bDouglas Gregor void f2(typename X0<T>::template Inner<T*, T&>::type); // expected-error{{redecl}} 706946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 71a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor 72a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregornamespace PR6236 { 73a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor template<typename T, typename U> struct S { }; 74a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor 75a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor template<typename T> struct S<T, T> { 76a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor template<typename U> struct K { }; 77a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor 78a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor void f() { 79a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor typedef typename S<T, T>::template K<T> Foo; 80a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor } 81a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor }; 82a4e8c2a65a985782344a818d356c40d117fc4f12Douglas Gregor} 83ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor 84ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregornamespace PR6268 { 85ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor template <typename T> 86ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor struct Outer { 87ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor template <typename U> 88ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor struct Inner {}; 89ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor 90ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor template <typename U> 91ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor typename Outer<T>::template Inner<U> 92ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor foo(typename Outer<T>::template Inner<U>); 93ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor }; 94ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor 95ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor template <typename T> 96ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor template <typename U> 97ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor typename Outer<T>::template Inner<U> 98ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor Outer<T>::foo(typename Outer<T>::template Inner<U>) { 99ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor return Inner<U>(); 100ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor } 101ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor} 102a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor 103a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregornamespace PR6463 { 104a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor struct B { typedef int type; }; // expected-note 2{{member found by ambiguous name lookup}} 105a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor struct C { typedef int type; }; // expected-note 2{{member found by ambiguous name lookup}} 106a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor 107a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor template<typename T> 108a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor struct A : B, C { 109a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor type& a(); // expected-error{{found in multiple base classes}} 110a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor int x; 111a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor }; 112a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor 113a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor // FIXME: Improve source location info here. 114a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor template<typename T> 115a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor typename A<T>::type& A<T>::a() { // expected-error{{found in multiple base classes}} 116a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor return x; // expected-error{{undeclared identifier}} 117a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor } 118a50ce325b1ddd2bcbbfc1082ac93f3861d0a3a3dDouglas Gregor} 119