brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · d810ec7 Raw
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