On Tue, Feb 23, 2016 at 8:28 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Tue, Feb 23, 2016 at 8:15 AM, Michael Matz <m...@suse.de> wrote: >> Hi, >> >> On Tue, 23 Feb 2016, H.J. Lu wrote: >> >>> I thought >>> >>> --- >>> An empty type is a type where it and all of its subobjects (recursively) >>> are of class, structure, union, or array type. >>> --- >>> >>> excluded >>> >>> struct empty >>> { >>> empty () = default; >>> }; >> >> >> Why would that be excluded? There are no subobjects, hence all of them >> are of class, structure, union or array type, hence this is an empty type. >> (And that's good, it indeed looks quite empty to me). Even if you would >> add a non-trivial copy ctor, making this thing not trivially copyable >> anymore, it would still be empty. Hence, given your proposed language in >> the psABI, without reference to any other ABI (in particular not to the >> Itanium C++ ABI), you would then need to pass it without registers. That >> can't be done, and that's exactly why I find that wording incomplete. It >> needs implicit references to other languages ABIs to work. >> > > It is clear to me now. Let's go with > > --- > An empty type is a type where it and all of its subobjects (recursively) > are of class, structure, union, or array type. No memory slot nor > register should be used to pass or return an object of empty type that's > trivially copyable. > --- > > Any comments?
Yes. "trivially copyable" is the wrong restriction. See http://mentorembedded.github.io/cxx-abi/abi.html#normal-call for the actual Itanium C++ ABI rule. It's also completely nonsensical to mention this as a special case in relation to empty types. The special case applies to all function parameters, irrespective of whether they're empty -- this rule applies *long* before you consider whether the type is empty. For instance, in the x86-64 psABI, this should go right at the start of section 2.2.3 ("Parameter Passing and Returning Values"). But please don't add it there -- it's completely redundant, as section 5.1 already says that the Itanium C++ ABI is used, so it's not necessary to duplicate rules from there. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits