efriedma added a comment.

> I don't still understand how to mangle nested unnamed tags in general.

According to some quick experiments, for the non-virtual case, you mangle a 
member of an unnamed union it the same way as a regular member, except you 
stick `<unnamed-tag>@` into the mangling.  Additional levels of nesting append 
3's: `<unnamed-tag>@3`, `<unnamed-tag>@33`, etc.

----

The mangling with virtual inheritance seems pretty broken.  The following 
produces a name collision on MSVC:

  #pragma pointers_to_members(full_generality, virtual_inheritance)
  struct Nested { int a; union { int k; int k2;}; };
  struct DerivedVirtually : Nested { int a; };
  struct D2 { int DerivedVirtually::*p; };
  template<D2> void f() {}
  template void f<D2{&Nested::k}>();
  template void f<D2{&Nested::k2}>();

The following crashes MSVC:

  struct A {};
  struct Nested { int a; };
  struct DerivedVirtually : virtual A, Nested { };
  struct D2 { int DerivedVirtually::*p; };
  template<D2> void f() {}
  template void f<D2{&Nested::a}>();



================
Comment at: clang/lib/AST/MicrosoftMangle.cpp:1247
+      unsigned DiagID = Diags.getCustomDiagID(
+          DiagnosticsEngine::Error, "cannot mangle anonymous struct/union 
yet");
+      Diags.Report(DiagID);
----------------
maybe say "anonymous struct/union member pointer", if you don't implement this.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D146386/new/

https://reviews.llvm.org/D146386

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D146386:... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Erich Keane via Phabricator via cfe-commits
    • [PATCH] D14... Eli Friedman via Phabricator via cfe-commits
    • [PATCH] D14... John McCall via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Eli Friedman via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Eli Friedman via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits
    • [PATCH] D14... Andrey Ali Khan Bolshakov via Phabricator via cfe-commits

Reply via email to