Ping.
On Mon, Jul 1, 2013 at 11:31 PM, Reid Kleckner <[email protected]> wrote: > They don't seem to be used for back references, presumably because a > function template is unlikely to reoccur, while a class template name > may reoccur as a type. > > This fixes a mangling issue for llvm::hash_combine() in Hashing.h. > > http://llvm-reviews.chandlerc.com/D1078 > > Files: > lib/AST/MicrosoftMangle.cpp > test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp > test/CodeGenCXX/mangle-ms-back-references.cpp > > Index: lib/AST/MicrosoftMangle.cpp > =================================================================== > --- lib/AST/MicrosoftMangle.cpp > +++ lib/AST/MicrosoftMangle.cpp > @@ -420,7 +420,16 @@ > // Check if we have a template. > const TemplateArgumentList *TemplateArgs = 0; > if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { > - // We have a template. > + // Function templates aren't considered for name back referencing. > This > + // makes sense since function templates aren't likely to occur > multiple > + // times in a symbol. > + // FIXME: Test alias template mangling with MSVC 2013. > + if (!isa<ClassTemplateDecl>(TD)) { > + mangleTemplateInstantiationName(TD, *TemplateArgs); > + return; > + } > + > + // We have a class template. > // Here comes the tricky thing: if we need to mangle something like > // void foo(A::X<Y>, B::X<Y>), > // the X<Y> part is aliased. However, if you need to mangle > Index: test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp > =================================================================== > --- test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp > +++ test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp > @@ -107,7 +107,7 @@ > void foo(I<A> x) {} > // CHECK: "\01?foo@PR13207@@YAXV?$I@VA@PR13207@@@1@@Z" > void foo2(I<A> x, I<A> y) { } > -// CHECK "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z" > +// CHECK: "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z" > void bar(J<A,B> x) {} > // CHECK: "\01?bar@PR13207@@YAXV?$J@VA@PR13207@@VB@2@@1@@Z" > void spam(K<A,B,C> x) {} > @@ -163,3 +163,31 @@ > // CHECK: "\01?foobar@NC@PR13207@@YAXV?$Y@V?$Y@V?$Y@VX@NA@PR13207 > @@@NA@PR13207@@@NB@PR13207@@@12@@Z" > } > } > + > +// Function template names are not considered for backreferencing, but > normal > +// function names are. > +namespace fn_space { > +struct RetVal { int hash; }; > +template <typename T> > +RetVal fun_tmpl(const T &t) { return RetVal(); } > +RetVal fun_normal(int t) { return RetVal(); } > +void fun_instantiate() { > + fun_normal(1); > + fun_tmpl(1); > +} > +// CHECK: "\01?fun_normal@fn_space@@YA?AURetVal@1@H@Z" > +// CHECK: "\01??$fun_tmpl@H@fn_space@@YA?AURetVal@0@ABH@Z" > + > +template <typename T, RetVal (*F)(T)> > +RetVal fun_tmpl_recurse(T t) { > + if (!t) > + return RetVal(); > + return F(t - 1); > +} > +RetVal ident(int x) { return RetVal(); } > +void fun_instantiate2() { > + fun_tmpl_recurse<int, fun_tmpl_recurse<int, ident> >(10); > +} > +// CHECK: "\01??$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" > +// CHECK: "\01??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z > @fn_space@@YA?AURetVal@0@H@Z" > +} > Index: test/CodeGenCXX/mangle-ms-back-references.cpp > =================================================================== > --- test/CodeGenCXX/mangle-ms-back-references.cpp > +++ test/CodeGenCXX/mangle-ms-back-references.cpp > @@ -61,3 +61,8 @@ > > PInt3Func h3(PInt3Func x, PInt3Func y, int* z) { return 0; } > // CHECK: "\01?h3@@YAP6APAHPAH0@ZP6APAH00@Z10@Z" > + > +namespace foo { > +void foo() { } > +// CHECK: "\01?foo@0@YAXXZ" > +} >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
