rsmith added inline comments.

================
Comment at: lib/AST/ASTContext.cpp:2183-2184
+  for (const auto *Field : RD->fields()) {
+    if (!Context.hasUniqueObjectRepresentations(Field->getType()))
+      return false;
+    int64_t FieldSizeInBits =
----------------
erichkeane wrote:
> rsmith wrote:
> > erichkeane wrote:
> > > rsmith wrote:
> > > > What should happen for fields of reference type?
> > > References are not trivially copyable, so they will prevent the struct 
> > > from having a unique object representation.
> > That sounds like the wrong behavior to me. If two structs have references 
> > that bind to the same object, then they have the same object 
> > representation, so the struct does have unique object representations.
> I didn't think of it that way... I WILL note that GCC rejects references in 
> their implementation, but that could be a bug on their part.
The wording you quote below is defective in this regard (it doesn't discuss 
what "same value" means for reference members) -- that's at least partly my 
wording, sorry about that! But at least my intent when we were working on the 
rules was that "same value" would have the obvious structurally-recursive 
meaning, which for references means we're considering whether they have the 
same referent.

So I think references, like pointers, should always be considered to have 
unique object representations when considered as members of objects of class 
type. (But `__has_unique_object_representations(T&)` should still return 
`false` because `T&` is not a trivially-copyable type, even though a class 
containing a `T&` might be.)


================
Comment at: lib/AST/MicrosoftCXXABI.cpp:253
+
+  MPI.HasPadding = MPI.Width % MPI.Align == 0;
 
----------------
erichkeane wrote:
> rsmith wrote:
> > This seems to be backwards?
> > 
> > Also, I'm not sure whether this is correct. In the strange case where 
> > `Width` is not a multiple of `Align` (because we don't round up the width), 
> > there is no padding. We should only set `HasPadding` to `true` in the 
> > `alignTo` case below.
> I think you're right about it being backwards.
> 
> However, doesn't the struct with a single Ptr and either 1 or 3 Ints have 
> tail padding as well?  I do believe you're right about the alignTo situation 
> below, but only if Width changes, right?
I think the idea is that a struct with one pointer and an odd number of ints, 
on 32-bit Windows, will have no padding per se, but its size will simply not be 
a multiple of its alignment. (So struct layout can put things in the four bytes 
after it, but will insert padding before it to place it at an 8 byte boundary.)


https://reviews.llvm.org/D39347



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

Reply via email to