mangle-ms-back-references-pr13207.cpp revision 5e7b43ed3071a98d68b6da4f22720b9076d6f18a
1// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2
3template<class X, class Y, class Z>
4class A {};
5template<class X>
6class B {};
7template<class X>
8class C {};
9
10void foo_abbb(A<B<char>, B<char>, B<char> >) {}
11// CHECK: "\01?foo_abbb@@YAXV?$A@V?$B@D@@V1@V1@@@@Z"
12void foo_abb(A<char, B<char>, B<char> >) {}
13// CHECK: "\01?foo_abb@@YAXV?$A@DV?$B@D@@V1@@@@Z"
14void foo_abc(A<char, B<char>, C<char> >) {}
15// CHECK: "\01?foo_abc@@YAXV?$A@DV?$B@D@@V?$C@D@@@@@Z"
16
17namespace N {
18template<class X, class Y, class Z>
19class A {};
20template<class X>
21class B {};
22template<class X>
23class C {};
24template<class X, class Y>
25class D {};
26class Z {};
27}
28
29void foo_abbb(N::A<N::B<char>, N::B<char>, N::B<char> >) {}
30// CHECK: "\01?foo_abbb@@YAXV?$A@V?$B@D@N@@V12@V12@@N@@@Z"
31void foo_abb(N::A<char, N::B<char>, N::B<char> >) {}
32// CHECK: "\01?foo_abb@@YAXV?$A@DV?$B@D@N@@V12@@N@@@Z"
33void foo_abc(N::A<char, N::B<char>, N::C<char> >) {}
34// CHECK: "\01?foo_abc@@YAXV?$A@DV?$B@D@N@@V?$C@D@2@@N@@@Z"
35
36N::A<char, N::B<char>, N::C<char> > abc_foo() {
37// CHECK: ?abc_foo@@YA?AV?$A@DV?$B@D@N@@V?$C@D@2@@N@@XZ
38  return N::A<char, N::B<char>, N::C<char> >();
39}
40
41N::Z z_foo(N::Z arg) {
42// CHECK: ?z_foo@@YA?AVZ@N@@V12@@Z
43  return arg;
44}
45
46N::B<char> b_foo(N::B<char> arg) {
47// CHECK: ?b_foo@@YA?AV?$B@D@N@@V12@@Z
48  return arg;
49}
50
51N::D<char, char> d_foo(N::D<char, char> arg) {
52// CHECK: ?d_foo@@YA?AV?$D@DD@N@@V12@@Z
53  return arg;
54}
55
56N::A<char, N::B<char>, N::C<char> > abc_foo_abc(N::A<char, N::B<char>, N::C<char> >) {
57// CHECK: ?abc_foo_abc@@YA?AV?$A@DV?$B@D@N@@V?$C@D@2@@N@@V12@@Z
58  return N::A<char, N::B<char>, N::C<char> >();
59}
60
61namespace NA {
62class X {};
63template<class T> class Y {};
64}
65
66namespace NB {
67class X {};
68template<class T> class Y {};
69}
70
71void foo5(NA::Y<NB::Y<NA::Y<NB::Y<NA::X> > > > arg) {}
72// CHECK: "\01?foo5@@YAXV?$Y@V?$Y@V?$Y@V?$Y@VX@NA@@@NB@@@NA@@@NB@@@NA@@@Z"
73
74void foo11(NA::Y<NA::X>, NB::Y<NA::X>) {}
75// CHECK: "\01?foo11@@YAXV?$Y@VX@NA@@@NA@@V1NB@@@Z"
76
77void foo112(NA::Y<NA::X>, NB::Y<NB::X>) {}
78// CHECK: "\01?foo112@@YAXV?$Y@VX@NA@@@NA@@V?$Y@VX@NB@@@NB@@@Z"
79
80void foo22(NA::Y<NB::Y<NA::X> >, NB::Y<NA::Y<NA::X> >) {}
81// CHECK: "\01?foo22@@YAXV?$Y@V?$Y@VX@NA@@@NB@@@NA@@V?$Y@V?$Y@VX@NA@@@NA@@@NB@@@Z"
82
83namespace PR13207 {
84class A {};
85class B {};
86class C {};
87
88template<class X>
89class F {};
90template<class X>
91class I {};
92template<class X, class Y>
93class J {};
94template<class X, class Y, class Z>
95class K {};
96
97class L {
98 public:
99  void foo(I<A> x) {}
100};
101// CHECK: "\01?foo@L@PR13207@@QAEXV?$I@VA@PR13207@@@2@@Z"
102
103void call_l_foo(L* l) { l->foo(I<A>()); }
104
105void foo(I<A> x) {}
106// CHECK: "\01?foo@PR13207@@YAXV?$I@VA@PR13207@@@1@@Z"
107void foo2(I<A> x, I<A> y) { }
108// CHECK "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z"
109void bar(J<A,B> x) {}
110// CHECK: "\01?bar@PR13207@@YAXV?$J@VA@PR13207@@VB@2@@1@@Z"
111void spam(K<A,B,C> x) {}
112// CHECK: "\01?spam@PR13207@@YAXV?$K@VA@PR13207@@VB@2@VC@2@@1@@Z"
113
114void baz(K<char, F<char>, I<char> >) {}
115// CHECK: "\01?baz@PR13207@@YAXV?$K@DV?$F@D@PR13207@@V?$I@D@2@@1@@Z"
116void qux(K<char, I<char>, I<char> >) {}
117// CHECK: "\01?qux@PR13207@@YAXV?$K@DV?$I@D@PR13207@@V12@@1@@Z"
118
119namespace NA {
120class X {};
121template<class T> class Y {};
122void foo(Y<X> x) {}
123// CHECK: "\01?foo@NA@PR13207@@YAXV?$Y@VX@NA@PR13207@@@12@@Z"
124void foofoo(Y<Y<X> > x) {}
125// CHECK: "\01?foofoo@NA@PR13207@@YAXV?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@12@@Z"
126}
127
128namespace NB {
129class X {};
130template<class T> class Y {};
131void foo(Y<NA::X> x) {}
132// CHECK: "\01?foo@NB@PR13207@@YAXV?$Y@VX@NA@PR13207@@@12@@Z"
133
134void bar(NA::Y<X> x) {}
135// CHECK: "\01?bar@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@NA@2@@Z"
136
137void spam(NA::Y<NA::X> x) {}
138// CHECK: "\01?spam@NB@PR13207@@YAXV?$Y@VX@NA@PR13207@@@NA@2@@Z"
139
140void foobar(NA::Y<Y<X> > a, Y<Y<X> >) {}
141// CHECK: "\01?foobar@NB@PR13207@@YAXV?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V312@@Z"
142
143void foobarspam(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >) {}
144// CHECK: "\01?foobarspam@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V412@@Z"
145
146void foobarbaz(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c) {}
147// CHECK: "\01?foobarbaz@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V412@2@Z"
148
149void foobarbazqux(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c , NA::Y<Y<Y<X> > > d) {}
150// CHECK: "\01?foobarbazqux@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V412@2V?$Y@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NB@PR13207@@@52@@Z"
151}
152
153namespace NC {
154class X {};
155template<class T> class Y {};
156
157void foo(Y<NB::X> x) {}
158// CHECK: "\01?foo@NC@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@@Z"
159
160void foobar(NC::Y<NB::Y<NA::Y<NA::X> > > x) {}
161// CHECK: "\01?foobar@NC@PR13207@@YAXV?$Y@V?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@NB@PR13207@@@12@@Z"
162}
163}
164