rjmccall added a comment.

In D92361#2432578 <https://reviews.llvm.org/D92361#2432578>, @ahatanak wrote:

> It seems like you are discussing the case where a class/struct annotated with 
> `trivial_abi` contains a member that isn't destructively movable. In that 
> case, clang correctly diagnoses it today. For example, if you remove the 
> attribute from `S2` in the above example and add it to `S3` instead, it warns 
> that `trivial_abi` cannot be applied to `S3` because `S2` is a non-trivial 
> class type.
>
> What I wasn't sure was whether `S1` (which isn't annotated with `trivial_abi` 
> in the original code I posted) should be treated as a destructively movable 
> type despite having all its copy/move constructors deleted when its only 
> member (`s0`) is destructively movable.
>
> Based on the discussion we had a few years ago 
> (http://lists.llvm.org/pipermail/cfe-dev/2017-November/055966.html), I think 
> the answer is yes, but I just wanted to confirm.

Hmm.  My first instinct is to say that a type that "adds new information" about 
its special members — i.e. that explicitly declares its destructor or copy/move 
constructors for some reason other than to immediately explicitly default them 
— should always be treated conservatively in the absence of a `trivial_abi` 
attribute.  So a type that explicitly deletes all its copy/move constructors 
should never be treated as destructively movable without the attribute.  A type 
with implicitly-deleted copy/move constructors due solely to subobjects that 
are still destructively movable should still be destructively movable, I think.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92361/new/

https://reviews.llvm.org/D92361

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

Reply via email to