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