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>)36 void foo( T, Template1<typename make_type<T>::type> )
37 {
38 }
39 
40 template<typename T>
foo(T,Template2<typename make_type<T>::type>)41 void foo( T, Template2<typename make_type<T>::type> )
42 {
43 }
44 
main()45 int main()
46 {
47   Template1<Argument2> t;
48   Argument1 a;
49   foo( a, t );  // { dg-error "ambiguous" }
50   return 0;
51 }
52