majnemer added inline comments.
================
Comment at: lib/AST/MicrosoftMangle.cpp:1583-1584
@@ -1579,2 +1582,4 @@
case QMM_Result:
+ // Presence of __unaligned qualifier shouldn't affect mangling here.
+ Quals.removeUnaligned();
if ((!IsPointer && Quals) || isa<TagType>(T)) {
----------------
rnk wrote:
> majnemer wrote:
> > andreybokhanko wrote:
> > > majnemer wrote:
> > > > andreybokhanko wrote:
> > > > > Done. Test added.
> > > > Hmm, can you give a concrete example why we need this line?
> > > Sure. An example is:
> > >
> > > __unaligned int unaligned_foo3() { return 0; }
> > >
> > > MS mangles it as
> > >
> > > ?unaligned_foo3@@YAHXZ
> > >
> > > However, if __unaligned is taken into account, "if ((!IsPointer && Quals)
> > > || isa<TagType>(T))" computes to true and clang adds "?A", resulting to
> > >
> > > ?unaligned_foo3@@YA?AHXZ
> > >
> > > Yours,
> > > Andrey
> > >
> > Wait, I thought __unaligned can only apply to pointer types. Is this not
> > so?!
> > Does `__unaligned int x;` really keep it's `__unaligned` qualifier?
> Yeah it does:
> $ cat t.cpp
> __unaligned int x;
> $ cl -nologo -c t.cpp && dumpbin /symbols t.obj | grep ?x
> t.cpp
> 008 00000000 SECT3 notype External | ?x@@3HFA (int __unaligned x)
Woah. So if you do:
> __unaligned int unaligned_foo3() { return 0; }
> auto z = foo3();
How is `z` mangled?
http://reviews.llvm.org/D19654
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits