On 31 Jan 2019, at 16:57, Akira Hatanaka wrote:

Would it be better if we disallowed trivial_abi if the class’ copy and move destructors were all deleted (and revert r350920)? I think that would make it easier to reason about when you are allowed to use trivial_abi and what effect the attribute has (which is to override the trivialness for the purpose of calls).

Sorry for my late reply. It took a while to understand that the patch I committed might not be the right way to fix the problem.

I'd be fine with that. If nothing else, we can generalize it later if we decide that's an important use-case.

John.


On Jan 16, 2019, at 8:37 PM, John McCall via cfe-commits <cfe-commits@lists.llvm.org> wrote:

On 16 Jan 2019, at 20:03, Richard Smith wrote:

On Wed, 16 Jan 2019 at 16:20, John McCall via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

On 16 Jan 2019, at 18:32, Richard Smith wrote:

On Wed, 16 Jan 2019 at 09:10, John McCall via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

On 16 Jan 2019, at 9:13, Aaron Ballman wrote:

On Wed, Jan 16, 2019 at 1:57 AM Akira Hatanaka <ahatan...@apple.com>
wrote:

Yes, the behavior of the compiler doesn’t match what’s explained
in the documentation anymore.

Please take a look at the attached patch, which updates the
documentation.

Patch mostly LGTM, but I did have one wording suggestion.

diff --git a/include/clang/Basic/AttrDocs.td
b/include/clang/Basic/AttrDocs.td
index 5773a92c9c..ca3cfcf9b2 100644
--- a/include/clang/Basic/AttrDocs.td
+++ b/include/clang/Basic/AttrDocs.td
@@ -2478,15 +2478,20 @@ def TrivialABIDocs : Documentation {
  let Category = DocCatVariable;
  let Content = [{
The ``trivial_abi`` attribute can be applied to a C++ class, struct,
or union.
-It instructs the compiler to pass and return the type using the C
ABI for the
+``trivial_abi`` has the following effects:
+
+- It instructs the compiler to pass and return the type using the C
ABI for the
underlying type when the type would otherwise be considered
non-trivial for the
purpose of calls.
-A class annotated with `trivial_abi` can have non-trivial
destructors or copy/move constructors without automatically becoming
non-trivial for the purposes of calls. For example:
+- It makes the destructor and copy and move constructors of the
class trivial
+that would otherwise be considered non-trivial under the C++ ABI
rules.

How about: It makes the destructor, copy constructors, and move
constructors of the class trivial even if they would otherwise be
non-trivial under the C++ ABI rules.

Let's not say that it makes them trivial, because it doesn't. It causes
their immediate non-triviality to be ignored for the purposes of
deciding
whether the type can be passed in registers.


Given the attribute now forces the type to be passed in registers, I
think
it'd be more to the point to say that it makes the triviality of those special members be ignored when deciding whether to pass a type with a
subobject of this type in registers.

Wait, it forces it to be passed in registers?  I thought the design
was that it didn't override the non-trivial-abi-ness of subobjects;
see all the discussion of trivially_relocatable.


The attribute is ill-formed if applied to a class that has a subobject that can't be passed in registers (or that has a vptr). And then as a weird special case we don't instantiate the attribute when instantiating a class if it would be ill-formed (well, we instantiate it and then remove it
again, but the effect is the same).

The commit at the start of this email chain switches us from the "just override the trivialness for the purposes of the ABI" model to /also/ forcing the type to be passed in registers (the type would otherwise not be passed in registers in some corner cases, such as if all its copy/move
special members are deleted).

I see.  Alright, I accept your wording, then.

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


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

Reply via email to