On 03/16/2016 07:55 AM, H.J. Lu wrote:
On Tue, Mar 15, 2016 at 7:51 PM, Jason Merrill <ja...@redhat.com> wrote:
On 03/15/2016 08:25 PM, Joseph Myers wrote:

On Tue, 15 Mar 2016, H.J. Lu wrote:

On Tue, Mar 15, 2016 at 3:34 PM, Joseph Myers <jos...@codesourcery.com>
wrote:

On Tue, 15 Mar 2016, H.J. Lu wrote:

On Tue, Mar 15, 2016 at 2:39 PM, Joseph Myers <jos...@codesourcery.com>
wrote:

I'm not sure if the zero-size arrays (a GNU extension) are considered
to
make a struct non-empty, but in any case I think the tests should
cover
such arrays as elements of structs.


There are couple tests for structs with members of array
of empty types.  testsuite/g++.dg/abi/empty14.h has


My concern is the other way round - structs with elements such as
"int a[0];", an array [0] of a nonempty type.  My reading of the
subobject
definition is that such an array should not cause the struct to be
considered nonempty (it doesn't result in any int subobjects).


This is a test for struct with zero-size array, which isn't treated
as empty type.  C++ and C are compatible in its passing.


Where is the current definition of empty types you're proposing for use in
GCC?  Is the behavior of this case clear from that definition?


"An empty type is a type where it and all of its subobjects (recursively)
are of structure, union, or array type.  No memory slot nor register should
be used to pass or return an object of empty type."

It seems to me that such a struct should be considered an empty type under
this definition, since a zero-length array has no subobjects.

Since zero-size array is GCC extension, we can change it.   Do we
want to change its passing for C?

I would think so; it seems to follow clearly from this definition. I have trouble imagining that anyone would ever pass an object containing a zero-length array by value, so it shouldn't matter much either way, but I consistency is good.

Jason

Reply via email to