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