1 // PR c++/54987 2 3 struct Argument1 4 { 5 }; 6 7 struct Argument2 8 { 9 }; 10 11 template<typename T> 12 struct Template1 13 { Template1Template114 Template1() {} 15 16 template<typename Y> Template1Template117 Template1( const Template1<Y>& ) {} 18 }; 19 20 template<typename T> 21 struct Template2 22 { Template2Template223 Template2() {} 24 25 template<typename Y> Template2Template226 Template2( const Template1<Y>& ) {} 27 }; 28 29 template <typename T> 30 struct make_type 31 { 32 typedef Argument1 type; 33 }; 34 35 template<typename T> foo(T,Template1<typename make_type<T>::type>)36void foo( T, Template1<typename make_type<T>::type> ) 37 { 38 } 39 40 template<typename T> foo(T,Template2<typename make_type<T>::type>)41void foo( T, Template2<typename make_type<T>::type> ) 42 { 43 } 44 main()45int main() 46 { 47 Template1<Argument2> t; 48 Argument1 a; 49 foo( a, t ); // { dg-error "ambiguous" } 50 return 0; 51 } 52