On Mon, Feb 8, 2016 at 3:28 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > On Mon, Feb 8, 2016 at 3:01 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Mon, Feb 8, 2016 at 2:58 PM, Richard Smith <rich...@metafoo.co.uk> wrote: >>> On Mon, Feb 8, 2016 at 2:54 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Mon, Feb 8, 2016 at 2:51 PM, Richard Smith <rich...@metafoo.co.uk> >>>> wrote: >>>>> On Mon, Feb 8, 2016 at 2:46 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>> On Mon, Feb 8, 2016 at 2:35 PM, Richard Smith <rich...@metafoo.co.uk> >>>>>> wrote: >>>>>>> On Mon, Feb 8, 2016 at 1:40 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>> >>>>>>>> On Mon, Feb 8, 2016 at 12:38 PM, Richard Smith <rich...@metafoo.co.uk> >>>>>>>> wrote: >>>>>>>> > On Mon, Feb 8, 2016 at 12:05 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>> >> >>>>>>>> >> On Mon, Feb 8, 2016 at 11:33 AM, Jonathan Wakely >>>>>>>> >> <jwakely....@gmail.com> >>>>>>>> >> wrote: >>>>>>>> >> > On 8 February 2016 at 19:23, Richard Smith wrote: >>>>>>>> >> >> "POD for the purpose of layout" is defined in the Itanium C++ >>>>>>>> >> >> ABI here: >>>>>>>> >> >> >>>>>>>> >> >> http://mentorembedded.github.io/cxx-abi/abi.html#definitions >>>>>>>> >> > >>>>>>>> >> > Thanks. So there's no problem using "POD for the purposes of >>>>>>>> >> > layout", >>>>>>>> >> > and the change to "POD for the purpose of standard-layout" was >>>>>>>> >> > unnecessary and just confused things. >>>>>>>> >> >>>>>>>> >> Here is the revised proposal: >>>>>>>> >> >>>>>>>> >> 1. "class type". A class type is a structure, union or C++ class. >>>>>>>> >> 2. "empty class type". An empty class type is: >>>>>>>> >> a. A class type without member. Or >>>>>>>> >> b. A class type with only members of empty class types. Or >>>>>>>> > >>>>>>>> > >>>>>>>> > (a) is a special case of (b). >>>>>>>> > >>>>>>>> >> c. An array of empty class types. >>>>>>>> > >>>>>>>> > >>>>>>>> > It seems confusing to call an array a class type. Instead, how about: >>>>>>>> > >>>>>>>> > 2. An empty type is either an array of empty types or a class type >>>>>>>> > where >>>>>>>> > every member is of empty type. >>>>>>>> > >>>>>>>> >> 3. "empty record". An empty record is Plain Old Data (POD) for the >>>>>>>> >> purposes of layout and >>>>>>>> >> a. A class type without member. Or >>>>>>>> >> b. A class type with only members of empty class types. >>>>>>>> > >>>>>>>> > >>>>>>>> > (a) is a special case of (b). >>>>>>>> > >>>>>>>> >> 4. No memory slot nor register should be used to pass or return an >>>>>>>> >> object >>>>>>>> >> of empty record. >>>>>>>> > >>>>>>>> > >>>>>>>> > Objects of array type are never passed or returned (but if through >>>>>>>> > some >>>>>>>> > language extension they were, we'd want this rule to apply). So you >>>>>>>> > don't >>>>>>>> > need rule 3 and this can be just: >>>>>>>> > >>>>>>>> > 3. No memory slot nor register should be used to pass or return an >>>>>>>> > object >>>>>>>> > of empty type. >>>>>>>> >>>>>>>> Thanks very much for your inputs. Here is the proposal: >>>>>>>> >>>>>>>> 1. "class type". A class type is a structure, union or C++ class. >>>>>>>> 2. "empty type". An empty type is either an array of empty types or a >>>>>>>> class type where every member is of empty type. >>>>>>>> 3. No memory slot nor register should be used to pass or return an >>>>>>>> object >>>>>>>> of empty type. >>>>>>> >>>>>>> David Majnemer points out that we also need to say something about >>>>>>> base classes. We could handle that case like this: >>>>>>> >>>>>>> 2. "empty type". An empty type is a type where it and all of its >>>>>>> subobjects are of class or array type. >>>>>>> >>>>>>> Following the C++ rules, this also means that a class that contains >>>>>>> only unnamed bitfields is empty, because unnamed bitfields are not >>>>>>> subobjects, but might be worth explicitly stating for the C case. That >>>>>>> also matches Clang's behavior. >>>>>> >>>>>> Like this? >>>>>> >>>>>> 1. "class type". A class type is a structure, union or C++ class. >>>>>> 2. "empty type". An empty type is >>>>>> a. A type where it and all of its subobjects are of class or array >>>>>> type. And >>>>>> b. Either an array of empty types or a class type where every member >>>>>> is of empty type. >>>>> >>>>> You don't need (b). It's implied by (a). >>>> >>>> Does (a) cover empty type? >>> >>> Yes, (a) is a complete definition of "empty type" by itself: the >>> definition is, essentially, that a complete recursive walk of the type >>> and all its subobjects never sees anything that would require any >>> storage (that is, it only sees class types and array types). >> >> Is there a definition of subobject? > > Yes, the C++ standard defines the term (as an object that is contained > within another via member, base class, and array element > relationships). The C standard uses it in 6.7.9 to mean the same thing > (recursing into class and array elements) but doesn't provide a formal > definition.
Here is the new one: 1. "class type". A class type is a structure, union or C++ class. 2. "empty type". An empty type is Plain Old Data (POD) for the purposes of layout, and.a type where it and all of its subobjects are of class or array type. I put back " Plain Old Data (POD) for the purposes of layout" to explicitly exclude array here. -- H.J.