mangle-ms-back-references-pr13207.cpp [plain text]
template<class X, class Y, class Z>
class A {};
template<class X>
class B {};
template<class X>
class C {};
void foo_abbb(A<B<char>, B<char>, B<char> >) {}
void foo_abb(A<char, B<char>, B<char> >) {}
void foo_abc(A<char, B<char>, C<char> >) {}
namespace N {
template<class X, class Y, class Z>
class A {};
template<class X>
class B {};
template<class X>
class C {};
template<class X, class Y>
class D {};
class Z {};
}
void foo_abbb(N::A<N::B<char>, N::B<char>, N::B<char> >) {}
void foo_abb(N::A<char, N::B<char>, N::B<char> >) {}
void foo_abc(N::A<char, N::B<char>, N::C<char> >) {}
N::A<char, N::B<char>, N::C<char> > abc_foo() {
return N::A<char, N::B<char>, N::C<char> >();
}
N::Z z_foo(N::Z arg) {
return arg;
}
N::B<char> b_foo(N::B<char> arg) {
return arg;
}
N::D<char, char> d_foo(N::D<char, char> arg) {
return arg;
}
N::A<char, N::B<char>, N::C<char> > abc_foo_abc(N::A<char, N::B<char>, N::C<char> >) {
return N::A<char, N::B<char>, N::C<char> >();
}
namespace NA {
class X {};
template<class T> class Y {};
}
namespace NB {
class X {};
template<class T> class Y {};
}
void foo5(NA::Y<NB::Y<NA::Y<NB::Y<NA::X> > > > arg) {}
void foo11(NA::Y<NA::X>, NB::Y<NA::X>) {}
void foo112(NA::Y<NA::X>, NB::Y<NB::X>) {}
void foo22(NA::Y<NB::Y<NA::X> >, NB::Y<NA::Y<NA::X> >) {}
namespace PR13207 {
class A {};
class B {};
class C {};
template<class X>
class F {};
template<class X>
class I {};
template<class X, class Y>
class J {};
template<class X, class Y, class Z>
class K {};
class L {
public:
void foo(I<A> x) {}
};
void call_l_foo(L* l) { l->foo(I<A>()); }
void foo(I<A> x) {}
void foo2(I<A> x, I<A> y) { }
void bar(J<A,B> x) {}
void spam(K<A,B,C> x) {}
void baz(K<char, F<char>, I<char> >) {}
void qux(K<char, I<char>, I<char> >) {}
namespace NA {
class X {};
template<class T> class Y {};
void foo(Y<X> x) {}
void foofoo(Y<Y<X> > x) {}
}
namespace NB {
class X {};
template<class T> class Y {};
void foo(Y<NA::X> x) {}
void bar(NA::Y<X> x) {}
void spam(NA::Y<NA::X> x) {}
void foobar(NA::Y<Y<X> > a, Y<Y<X> >) {}
void foobarspam(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >) {}
void foobarbaz(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c) {}
void foobarbazqux(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c , NA::Y<Y<Y<X> > > d) {}
}
namespace NC {
class X {};
template<class T> class Y {};
void foo(Y<NB::X> x) {}
void foobar(NC::Y<NB::Y<NA::Y<NA::X> > > x) {}
}
}