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