typename-specifier-4.cpp revision 6946baf3542dcb1ed0d98d0fdda451d1c39a49c2
16946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor// RUN: clang-cc -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 466946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregortemplate<typename T> 476946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregorstruct X0 { 486946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor template<typename U, typename V> 496946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor struct Inner; 506946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 516946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f0(X0<T>::Inner<T*, T&>); // expected-note{{here}} 526946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f0(typename X0<T>::Inner<T*, T&>); // expected-error{{redecl}} 536946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor 546946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f1(X0<T>::Inner<T*, T&>); // expected-note{{here}} 556946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor void f1(typename X0<T>::template Inner<T*, T&>); // expected-error{{redecl}} 566946baf3542dcb1ed0d98d0fdda451d1c39a49c2Douglas Gregor}; 57