rsmith added inline comments.

================
Comment at: clang/lib/AST/RecordLayoutBuilder.cpp:1890
 
-  bool FieldPacked = Packed || D->hasAttr<PackedAttr>();
+  llvm::Triple Target = Context.getTargetInfo().getTriple();
+  bool FieldPacked = (Packed && (!FieldClass || FieldClass->isPOD() ||
----------------
rnk wrote:
> I think GCC implements this by ignoring the packed attribute on classes with 
> such non-C++98-pod fields. See this case for example:
> https://gcc.godbolt.org/z/fe8x1ne7o
> ```
> class NonPod {
>     void method();
>     int x;
> };
> struct __attribute__((packed)) PackedNonPod {
>     char a;
>     NonPod b;
>     char c;
>     int d;
> };
> PackedNonPod gv;
> 
> static_assert(sizeof(PackedNonPod) == 4 * 4, "drop packed");
> ```
> -->
> ```
> <source>:7:12: warning: ignoring packed attribute because of unpacked non-POD 
> field 'NonPod PackedNonPod::b'
>     7 |     NonPod b;
> ```
> 
> So, in this case, the entire record is unpacked. `d` appears at offset 12, 
> and the overall size is 16. Your code, as I understand it, handles each field 
> individually, which isn't quite the same.
> 
> I think the fix is in Sema somewhere to drop the attribute.
GCC's diagnostic says it's ignoring the attribute, but that does not appear to 
actually be true. https://godbolt.org/z/jY1joGPjW (Note that the `short` field 
is being packed here, despite the warning saying the attribute was ignored.)

In your case, I think what's happening is that `PackedNonPod::d` is at offsets 
[9,13) within `PackedNonPod`, but the alignment of `PackedNonPod` is 4 because 
the `NonPod` field is not packed, so the size ends up being rounded up to 16 
like it would be if it were not packed. You can add three more chars to the end 
of the struct without it getting larger: https://gcc.godbolt.org/z/qTzeosWWW

So I think the patch is correctly modeling the GCC behavior.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D117616

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to