257 lines · cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s2 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: "?foo_abbb@@YAXV?$A@V?$B@D@@V1@V1@@@@Z"12void foo_abb(A<char, B<char>, B<char> >) {}13// CHECK: "?foo_abb@@YAXV?$A@DV?$B@D@@V1@@@@Z"14void foo_abc(A<char, B<char>, C<char> >) {}15// CHECK: "?foo_abc@@YAXV?$A@DV?$B@D@@V?$C@D@@@@@Z"16void foo_bt(bool a, B<bool(bool)> b) {}17// CHECK: "?foo_bt@@YAX_NV?$B@$$A6A_N_N@Z@@@Z"18 19namespace N {20template<class X, class Y, class Z>21class A {};22template<class X>23class B {};24template<class X>25class C {};26template<class X, class Y>27class D {};28class Z {};29}30 31void foo_abbb(N::A<N::B<char>, N::B<char>, N::B<char> >) {}32// CHECK: "?foo_abbb@@YAXV?$A@V?$B@D@N@@V12@V12@@N@@@Z"33void foo_abb(N::A<char, N::B<char>, N::B<char> >) {}34// CHECK: "?foo_abb@@YAXV?$A@DV?$B@D@N@@V12@@N@@@Z"35void foo_abc(N::A<char, N::B<char>, N::C<char> >) {}36// CHECK: "?foo_abc@@YAXV?$A@DV?$B@D@N@@V?$C@D@2@@N@@@Z"37 38N::A<char, N::B<char>, N::C<char> > abc_foo() {39// CHECK: ?abc_foo@@YA?AV?$A@DV?$B@D@N@@V?$C@D@2@@N@@XZ40 return N::A<char, N::B<char>, N::C<char> >();41}42 43N::Z z_foo(N::Z arg) {44// CHECK: ?z_foo@@YA?AVZ@N@@V12@@Z45 return arg;46}47 48N::B<char> b_foo(N::B<char> arg) {49// CHECK: ?b_foo@@YA?AV?$B@D@N@@V12@@Z50 return arg;51}52 53N::D<char, char> d_foo(N::D<char, char> arg) {54// CHECK: ?d_foo@@YA?AV?$D@DD@N@@V12@@Z55 return arg;56}57 58N::A<char, N::B<char>, N::C<char> > abc_foo_abc(N::A<char, N::B<char>, N::C<char> >) {59// CHECK: ?abc_foo_abc@@YA?AV?$A@DV?$B@D@N@@V?$C@D@2@@N@@V12@@Z60 return N::A<char, N::B<char>, N::C<char> >();61}62 63namespace NA {64class X {};65template<class T> class Y {};66}67 68namespace NB {69class X {};70template<class T> class Y {};71}72 73void foo5(NA::Y<NB::Y<NA::Y<NB::Y<NA::X> > > > arg) {}74// CHECK: "?foo5@@YAXV?$Y@V?$Y@V?$Y@V?$Y@VX@NA@@@NB@@@NA@@@NB@@@NA@@@Z"75 76void foo11(NA::Y<NA::X>, NB::Y<NA::X>) {}77// CHECK: "?foo11@@YAXV?$Y@VX@NA@@@NA@@V1NB@@@Z"78 79void foo112(NA::Y<NA::X>, NB::Y<NB::X>) {}80// CHECK: "?foo112@@YAXV?$Y@VX@NA@@@NA@@V?$Y@VX@NB@@@NB@@@Z"81 82void foo22(NA::Y<NB::Y<NA::X> >, NB::Y<NA::Y<NA::X> >) {}83// CHECK: "?foo22@@YAXV?$Y@V?$Y@VX@NA@@@NB@@@NA@@V?$Y@V?$Y@VX@NA@@@NA@@@NB@@@Z"84 85namespace PR13207 {86class A {};87class B {};88class C {};89 90template<class X>91class F {};92template<class X>93class I {};94template<class X, class Y>95class J {};96template<class X, class Y, class Z>97class K {};98 99class L {100 public:101 void foo(I<A> x) {}102};103// CHECK: "?foo@L@PR13207@@QAEXV?$I@VA@PR13207@@@2@@Z"104 105void call_l_foo(L* l) { l->foo(I<A>()); }106 107void foo(I<A> x) {}108// CHECK: "?foo@PR13207@@YAXV?$I@VA@PR13207@@@1@@Z"109void foo2(I<A> x, I<A> y) { }110// CHECK: "?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z"111void bar(J<A,B> x) {}112// CHECK: "?bar@PR13207@@YAXV?$J@VA@PR13207@@VB@2@@1@@Z"113void spam(K<A,B,C> x) {}114// CHECK: "?spam@PR13207@@YAXV?$K@VA@PR13207@@VB@2@VC@2@@1@@Z"115 116void baz(K<char, F<char>, I<char> >) {}117// CHECK: "?baz@PR13207@@YAXV?$K@DV?$F@D@PR13207@@V?$I@D@2@@1@@Z"118void qux(K<char, I<char>, I<char> >) {}119// CHECK: "?qux@PR13207@@YAXV?$K@DV?$I@D@PR13207@@V12@@1@@Z"120 121namespace NA {122class X {};123template<class T> class Y {};124void foo(Y<X> x) {}125// CHECK: "?foo@NA@PR13207@@YAXV?$Y@VX@NA@PR13207@@@12@@Z"126void foofoo(Y<Y<X> > x) {}127// CHECK: "?foofoo@NA@PR13207@@YAXV?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@12@@Z"128}129 130namespace NB {131class X {};132template<class T> class Y {};133void foo(Y<NA::X> x) {}134// CHECK: "?foo@NB@PR13207@@YAXV?$Y@VX@NA@PR13207@@@12@@Z"135 136void bar(NA::Y<X> x) {}137// CHECK: "?bar@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@NA@2@@Z"138 139void spam(NA::Y<NA::X> x) {}140// CHECK: "?spam@NB@PR13207@@YAXV?$Y@VX@NA@PR13207@@@NA@2@@Z"141 142void foobar(NA::Y<Y<X> > a, Y<Y<X> >) {}143// CHECK: "?foobar@NB@PR13207@@YAXV?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V312@@Z"144 145void foobarspam(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >) {}146// CHECK: "?foobarspam@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V412@@Z"147 148void foobarbaz(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c) {}149// CHECK: "?foobarbaz@NB@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@V?$Y@V?$Y@VX@NB@PR13207@@@NB@PR13207@@@NA@2@V412@2@Z"150 151void foobarbazqux(Y<X> a, NA::Y<Y<X> > b, Y<Y<X> >, Y<Y<X> > c , NA::Y<Y<Y<X> > > d) {}152// CHECK: "?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"153}154 155namespace NC {156class X {};157template<class T> class Y {};158 159void foo(Y<NB::X> x) {}160// CHECK: "?foo@NC@PR13207@@YAXV?$Y@VX@NB@PR13207@@@12@@Z"161 162void foobar(NC::Y<NB::Y<NA::Y<NA::X> > > x) {}163// CHECK: "?foobar@NC@PR13207@@YAXV?$Y@V?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@NB@PR13207@@@12@@Z"164}165}166 167// Function template names are not considered for backreferencing, but normal168// function names are.169namespace fn_space {170struct RetVal { int hash; };171template <typename T>172RetVal fun_tmpl(const T &t) { return RetVal(); }173RetVal fun_normal(int t) { return RetVal(); }174void fun_instantiate() {175 fun_normal(1);176 fun_tmpl(1);177}178// CHECK: "?fun_normal@fn_space@@YA?AURetVal@1@H@Z"179// CHECK: "??$fun_tmpl@H@fn_space@@YA?AURetVal@0@ABH@Z"180 181template <typename T, RetVal (*F)(T)>182RetVal fun_tmpl_recurse(T t) {183 if (!t)184 return RetVal();185 return F(t - 1);186}187RetVal ident(int x) { return RetVal(); }188void fun_instantiate2() {189 fun_tmpl_recurse<int, fun_tmpl_recurse<int, ident> >(10);190}191// CHECK: "??$fun_tmpl_recurse@H$1??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@1@H@Z@fn_space@@YA?AURetVal@0@H@Z"192// CHECK: "??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@0@H@Z"193}194 195 196template <class T1, class T2, class T3, class T4, class T5, class T6, class T7,197 class T8, class T9, class T10>198struct Fooob {};199 200using A0 = Fooob<int, int, int, int, int, int, int, int, int, int>;201using A1 = Fooob<A0, A0, A0, A0, A0, A0, A0, A0, A0, A0>;202using A2 = Fooob<A1, A1, A1, A1, A1, A1, A1, A1, A1, A1>;203using A3 = Fooob<A2, A2, A2, A2, A2, A2, A2, A2, A2, A2>;204using A4 = Fooob<A3, A3, A3, A3, A3, A3, A3, A3, A3, A3>;205using A5 = Fooob<A4, A4, A4, A4, A4, A4, A4, A4, A4, A4>;206using A6 = Fooob<A5, A5, A5, A5, A5, A5, A5, A5, A5, A5>;207using A7 = Fooob<A6, A6, A6, A6, A6, A6, A6, A6, A6, A6>;208using A8 = Fooob<A7, A7, A7, A7, A7, A7, A7, A7, A7, A7>;209using A9 = Fooob<A8, A8, A8, A8, A8, A8, A8, A8, A8, A8>;210using A10 = Fooob<A9, A9, A9, A9, A9, A9, A9, A9, A9, A9>;211 212// This should take milliseconds, not minutes.213void f(A9 a) {}214// CHECK: "?f@@YAXU?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@U?$Fooob@HHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@@Z"215 216 217template <class T1, class T2, class T3, class T4, class T5, class T6, class T7,218 class T8, class T9, class T10, class T11, class T12, class T13,219 class T14, class T15, class T16, class T17, class T18, class T19,220 class T20>221struct Food {};222 223using B0 = Food<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>;224using B1 = Food<B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0, B0>;225using B2 = Food<B1, B0, B0, B0, B0, B0, B0, B0, B0, B0, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1>;226using B3 = Food<B2, B1, B0, B0, B0, B0, B0, B0, B0, B0, B2, B2, B2, B2, B2, B2, B2, B2, B2, B2>;227using B4 = Food<B3, B2, B1, B0, B0, B0, B0, B0, B0, B0, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3>;228using B5 = Food<B4, B3, B2, B1, B0, B0, B0, B0, B0, B0, B4, B4, B4, B4, B4, B4, B4, B4, B4, B4>;229using B6 = Food<B5, B4, B3, B2, B1, B0, B0, B0, B0, B0, B5, B5, B5, B5, B5, B5, B5, B5, B5, B5>;230 231// This too should take milliseconds, not minutes.232void f(B6 a) {}233 234// CHECK: "?f@@YAXU?$Food@U?$Food@U?$Food@U?$Food@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U3@U3@U3@U3@U3@U3@U3@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U4@U4@U4@U4@U4@U4@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U3@U3@U3@U3@U3@U3@U3@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U5@U5@U5@U5@U5@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U3@U3@U3@U3@U3@U3@U3@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U4@U4@U4@U4@U4@U4@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U3@U3@U3@U3@U3@U3@U3@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U2@U2@U2@U2@U2@U2@U2@U2@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@U?$Food@HHHHHHHHHHHHHHHHHHHH@@U6@U6@U6@U6@U1@U1@U1@U1@U1@U1@U1@U1@U1@U1@@@@Z"235 236 237// Similar to the previous case, except that the later arguments aren't238// present in the earlier ones and hence aren't in the backref cache.239template <class T1, class T2, class T3, class T4, class T5, class T6, class T7,240 class T8, class T9, class T10, class T11, class T12, class T13,241 class T14, class T15, class T16, class T17, class T18, class T19,242 class T20>243struct Fooe {};244 245using C0 = Fooe<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>;246using C1 = Fooe<C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0>;247using C2 = Fooe<C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1>;248using C3 = Fooe<C1, C1, C0, C0, C0, C0, C0, C0, C0, C0, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2>;249using C4 = Fooe<C2, C2, C1, C0, C0, C0, C0, C0, C0, C0, C3, C3, C3, C3, C3, C3, C3, C3, C3, C3>;250using C5 = Fooe<C3, C3, C2, C1, C0, C0, C0, C0, C0, C0, C4, C4, C4, C4, C4, C4, C4, C4, C4, C4>;251using C6 = Fooe<C4, C4, C3, C2, C1, C0, C0, C0, C0, C0, C5, C5, C5, C5, C5, C5, C5, C5, C5, C5>;252using C7 = Fooe<C5, C4, C3, C2, C1, C0, C0, C0, C0, C0, C6, C6, C6, C6, C6, C6, C6, C6, C6, C6>;253 254// This too should take milliseconds, not minutes.255void f(C7 a) {}256// CHECK: "??@f23afdfb44276eaa53a5575352cf0ebc@"257