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