// RUN: clang-cc -fsyntax-only -verify %s // This test concerns the identity of dependent types within the // canonical type system, specifically focusing on the difference // between members of the current instantiation and membmers of an // unknown specialization. This considers C++ [temp.type], which // specifies type equivalence within a template, and C++0x // [temp.dep.type], which defines what it means to be a member of the // current instantiation. template struct X0 { typedef T T_type; typedef U U_type; void f0(T&); // expected-note{{previous}} void f0(typename X0::U_type&); void f0(typename X0::T_type&); // expected-error{{redecl}} void f1(T&); // expected-note{{previous}} void f1(typename X0::U_type&); void f1(typename X0::T_type&); // expected-error{{redecl}} void f2(T&); // expected-note{{previous}} void f2(typename X0::U_type&); void f2(typename X0::T_type&); // expected-error{{redecl}} void f3(T&); // expected-note{{previous}} void f3(typename X0::U_type&); void f3(typename ::X0::T_type&); // expected-error{{redecl}} struct X1 { typedef T my_T_type; void g0(T&); // expected-note{{previous}} void g0(typename X0::U_type&); void g0(typename X0::T_type&); // expected-error{{redecl}} void g1(T&); // expected-note{{previous}} void g1(typename X0::U_type&); void g1(typename X0::T_type&); // expected-error{{redecl}} void g2(T&); // expected-note{{previous}} void g2(typename X0::U_type&); void g2(typename X0::T_type&); // expected-error{{redecl}} void g3(T&); // expected-note{{previous}} void g3(typename X0::U_type&); void g3(typename ::X0::T_type&); // expected-error{{redecl}} void g4(T&); // expected-note{{previous}} void g4(typename X0::U_type&); void g4(typename X1::my_T_type&); // expected-error{{redecl}} void g5(T&); // expected-note{{previous}} void g5(typename X0::U_type&); void g5(typename X0::X1::my_T_type&); // expected-error{{redecl}} void g6(T&); // expected-note{{previous}} void g6(typename X0::U_type&); void g6(typename X0::X1::my_T_type&); // expected-error{{redecl}} void g7(T&); // expected-note{{previous}} void g7(typename X0::U_type&); void g7(typename ::X0::X1::my_T_type&); // expected-error{{redecl}} void g8(T&); // expected-note{{previous}} void g8(typename X0::T_type&); void g8(typename ::X0::X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}} }; };