================
@@ -844,7 +847,18 @@ const FieldDecl 
*CodeGenFunction::FindFlexibleArrayMemberField(
       if (const FieldDecl *Field =
----------------
bwendling wrote:

> FieldNo and Layout are referring to fields of "RD"; the "Field" found in the 
> recursive visit is a member of Record (or some subobject of Record). So the 
> code is doing math on completely unrelated offsets. Checking getFieldCount is 
> just masking the issue.

That's not the issue. What's happening is when an inner struct is 
declared/defined, we recurse within it to try to find the `Field` offset. If we 
do find it, then `Offset` has the offset value within `Record`. At this point, 
what we need is the offset up to the `RecordDecl`, but since those may or may 
not have a field number associated with them, we use the last `FieldNo` to get 
that offset.

A bit clearer:

```
struct foo {        /* <- Passed in as RD */
  struct bar {      /* <- Not a field, so FieldNo isn't incremented. Recurse on 
struct bar */
    int array[];    /* <- FAM found at offset 0 of struct bar */
  };
                    /* <- Returning with the array FieldDecl, we want to add on 
any
                          offset associated with the placement of the struct bar
                          definition, but there are no FieldDecls, and so we 
can't
                          call 'Layout.getFieldOffset()' */
};
```

This has obvious issues with virtual classes and the like, which is why C++ 
doesn't officially support FAMs (I believe it's an extension).

To be fair, I had the same question you had. I should document this better.

> Maybe instead of looking for RecordDecls, this code should be looking for 
> fields where the type of the field is an anonymous struct/union.

We want to look into all inner structs to find a FAM that may be lurking deep 
down within the bowels of the struct, which may involve non-anonymous structs.

https://github.com/llvm/llvm-project/pull/89126
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to