1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// This test concerns the identity of dependent types within the
442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// canonical type system, specifically focusing on the difference
5713c287caf70922f93cfd9292540bad274c4a82fRichard Smith// between members of the current instantiation and members of an
642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// unknown specialization. This considers C++ [temp.type], which
742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// specifies type equivalence within a template, and C++0x
842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// [temp.dep.type], which defines what it means to be a member of the
942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor// current instantiation.
1042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
1142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregortemplate<typename T, typename U>
1242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregorstruct X0 {
1342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  typedef T T_type;
1442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  typedef U U_type;
1542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
1642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f0(T&); // expected-note{{previous}}
1742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f0(typename X0::U_type&);
1842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f0(typename X0::T_type&); // expected-error{{redecl}}
1942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
2042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f1(T&); // expected-note{{previous}}
2142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f1(typename X0::U_type&);
2242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
2342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
2442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f2(T&); // expected-note{{previous}}
2542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f2(typename X0::U_type&);
2642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
2742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
2842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f3(T&); // expected-note{{previous}}
2942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f3(typename X0::U_type&);
3042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  void f3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
3142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
3242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  struct X1 {
3342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    typedef T my_T_type;
3442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
3542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g0(T&); // expected-note{{previous}}
3642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g0(typename X0::U_type&);
3742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g0(typename X0::T_type&); // expected-error{{redecl}}
3842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
3942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g1(T&); // expected-note{{previous}}
4042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g1(typename X0::U_type&);
4142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
4242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
4342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g2(T&); // expected-note{{previous}}
4442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g2(typename X0::U_type&);
4542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
4642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
4742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g3(T&); // expected-note{{previous}}
4842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g3(typename X0::U_type&);
4942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
5042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
5142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g4(T&); // expected-note{{previous}}
5242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g4(typename X0::U_type&);
5342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g4(typename X1::my_T_type&); // expected-error{{redecl}}
5442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
5542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g5(T&); // expected-note{{previous}}
5642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g5(typename X0::U_type&);
5742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g5(typename X0::X1::my_T_type&); // expected-error{{redecl}}
5842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
5942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g6(T&); // expected-note{{previous}}
6042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g6(typename X0::U_type&);
6142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g6(typename X0<T, U>::X1::my_T_type&); // expected-error{{redecl}}
6242af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
6342af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g7(T&); // expected-note{{previous}}
6442af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g7(typename X0::U_type&);
6542af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g7(typename ::X0<typename X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
6642af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor
6742af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g8(T&); // expected-note{{previous}}
6842af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g8(typename X0<U, T_type>::T_type&);
6942af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor    void g8(typename ::X0<typename X0<T_type, U>::X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
7042af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor  };
7142af25f865a82022a04bedeb483ac251c4412e29Douglas Gregor};
72c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
73c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
74c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregortemplate<typename T, typename U>
75c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregorstruct X0<T*, U*> {
76c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  typedef T T_type;
77c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  typedef U U_type;
78c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  typedef T* Tptr;
79c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  typedef U* Uptr;
80c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
81c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f0(T&); // expected-note{{previous}}
82c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f0(typename X0::U_type&);
83c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f0(typename X0::T_type&); // expected-error{{redecl}}
84c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
85c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f1(T&); // expected-note{{previous}}
86c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f1(typename X0::U_type&);
87c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
88c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
89c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f2(T&); // expected-note{{previous}}
90c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f2(typename X0::U_type&);
91c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
92c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
93c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f3(T&); // expected-note{{previous}}
94c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f3(typename X0::U_type&);
95c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
96c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
97c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f4(T&); // expected-note{{previous}}
98c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f4(typename X0::U_type&);
99c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f4(typename ::X0<Tptr, Uptr>::T_type&); // expected-error{{redecl}}
100c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
101c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f5(X0*); // expected-note{{previous}}
102c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f5(::X0<T, U>*);
103c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  void f5(::X0<T*, U*>*); // expected-error{{redecl}}
104c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
105c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  struct X2 {
106c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    typedef T my_T_type;
107c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
108c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g0(T&); // expected-note{{previous}}
109c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g0(typename X0::U_type&);
110c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g0(typename X0::T_type&); // expected-error{{redecl}}
111c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
112c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g1(T&); // expected-note{{previous}}
113c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g1(typename X0::U_type&);
114c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
115c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
116c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g2(T&); // expected-note{{previous}}
117c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g2(typename X0::U_type&);
118c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
119c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
120c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g3(T&); // expected-note{{previous}}
121c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g3(typename X0::U_type&);
122c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
123c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
124c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g4(T&); // expected-note{{previous}}
125c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g4(typename X0::U_type&);
126c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g4(typename X2::my_T_type&); // expected-error{{redecl}}
127c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
128c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g5(T&); // expected-note{{previous}}
129c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g5(typename X0::U_type&);
130c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g5(typename X0::X2::my_T_type&); // expected-error{{redecl}}
131c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
132c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g6(T&); // expected-note{{previous}}
133c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g6(typename X0::U_type&);
134c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g6(typename X0<T*, U*>::X2::my_T_type&); // expected-error{{redecl}}
135c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
136c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g7(T&); // expected-note{{previous}}
137c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g7(typename X0::U_type&);
138c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g7(typename ::X0<typename X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
139c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor
140c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g8(T&); // expected-note{{previous}}
141c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g8(typename X0<U, T_type>::T_type&);
142c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor    void g8(typename ::X0<typename X0<T_type*, U*>::X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
143c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor  };
144c5b8c9b6607de7ce25a28f26a34f43efa5728cb7Douglas Gregor};
145ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor
146ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregortemplate<typename T>
147ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregorstruct X1 {
148ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor  static int *a;
149ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor  void f(float *b) {
150ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor    X1<T>::a = b; // expected-error{{incompatible}}
151ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor    X1<T*>::a = b;
152ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor  }
153ac564f3e8d79c44fefa5da5ab1b58484ae781051Douglas Gregor};
15485bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor
15585bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregornamespace ConstantInCurrentInstantiation {
15685bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  template<typename T>
15785bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  struct X {
15885bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor    static const int value = 2;
15985bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor    static int array[value];
16085bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  };
16185bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor
16285bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  template<typename T> const int X<T>::value;
16385bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor
16485bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  template<typename T>
16585bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor  int X<T>::array[X<T>::value] = { 1, 2 };
16685bcd9920582f4d3879d8fbbaf4ca4fe09690160Douglas Gregor}
1676813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1686813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregornamespace Expressions {
1696813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <bool b>
1706813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct Bool {
1716813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor    enum anonymous_enum { value = b };
1726813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  };
1736813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct True : public Bool<true> {};
1746813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct False : public Bool<false> {};
1756813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1766813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename T1, typename T2>
1776813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct Is_Same : public False {};
1786813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename T>
1796813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct Is_Same<T, T> : public True {};
1806813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1816813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <bool b, typename T = void>
1826813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct Enable_If {};
1836813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename T>
1846813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  struct Enable_If<true, T>  {
1856813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor    typedef T type;
1866813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  };
1876813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1886813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename T>
1896813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  class Class {
1906813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  public:
1916813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor    template <typename U>
1926813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor    typename Enable_If<Is_Same<U, Class>::value, void>::type
1936813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor    foo();
1946813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  };
1956813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1966813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor
1976813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename T>
1986813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  template <typename U>
1996813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  typename Enable_If<Is_Same<U, Class<T> >::value, void>::type
2006813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor  Class<T>::foo() {}
2016813d7ba5fa79e36bdb3986e7f3f8100915a61abDouglas Gregor}
202d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor
203d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregornamespace PR9255 {
204d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor  template<typename T>
205d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor  class X0  {
206d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor  public:
207d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor    class Inner1;
208d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor
209d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor    class Inner2  {
210d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor    public:
211d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor      void f()
212d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor      {
213d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor        Inner1::f.g();
214d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor      }
215d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor    };
216d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor  };
217d9ea180032eda76a46c099a9aab99512447c326dDouglas Gregor}
2182060650f2743650a815ce3daa414352911d408fdDouglas Gregor
2192060650f2743650a815ce3daa414352911d408fdDouglas Gregornamespace rdar10194295 {
2202060650f2743650a815ce3daa414352911d408fdDouglas Gregor  template<typename XT>
2212060650f2743650a815ce3daa414352911d408fdDouglas Gregor  class X {
2222060650f2743650a815ce3daa414352911d408fdDouglas Gregor  public:
2232060650f2743650a815ce3daa414352911d408fdDouglas Gregor    enum Enum { Yes, No };
2242060650f2743650a815ce3daa414352911d408fdDouglas Gregor    template<Enum> void foo();
2252060650f2743650a815ce3daa414352911d408fdDouglas Gregor    template<Enum> class Inner;
2262060650f2743650a815ce3daa414352911d408fdDouglas Gregor  };
2272060650f2743650a815ce3daa414352911d408fdDouglas Gregor
2282060650f2743650a815ce3daa414352911d408fdDouglas Gregor  template<typename XT>
2292060650f2743650a815ce3daa414352911d408fdDouglas Gregor  template<typename X<XT>::Enum>
2302060650f2743650a815ce3daa414352911d408fdDouglas Gregor  void X<XT>::foo()
2312060650f2743650a815ce3daa414352911d408fdDouglas Gregor  {
2322060650f2743650a815ce3daa414352911d408fdDouglas Gregor  }
2332060650f2743650a815ce3daa414352911d408fdDouglas Gregor
2342060650f2743650a815ce3daa414352911d408fdDouglas Gregor  template<typename XT>
2352060650f2743650a815ce3daa414352911d408fdDouglas Gregor  template<typename X<XT>::Enum>
2362060650f2743650a815ce3daa414352911d408fdDouglas Gregor  class X<XT>::Inner { };
2372060650f2743650a815ce3daa414352911d408fdDouglas Gregor}
238713c287caf70922f93cfd9292540bad274c4a82fRichard Smith
239713c287caf70922f93cfd9292540bad274c4a82fRichard Smithnamespace RebuildDependentScopeDeclRefExpr {
240713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  template<int> struct N {};
241713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  template<typename T> struct X {
242713c287caf70922f93cfd9292540bad274c4a82fRichard Smith    static const int thing = 0;
243713c287caf70922f93cfd9292540bad274c4a82fRichard Smith    N<thing> data();
244713c287caf70922f93cfd9292540bad274c4a82fRichard Smith    N<thing> foo();
245713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  };
246713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  template<typename T> N<X<T>::thing> X<T>::data() {}
247713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  // FIXME: We should issue a typo-correction here.
248713c287caf70922f93cfd9292540bad274c4a82fRichard Smith  template<typename T> N<X<T>::think> X<T>::foo() {} // expected-error {{no member named 'think' in 'X<T>'}}
249713c287caf70922f93cfd9292540bad274c4a82fRichard Smith}
250