[PATCH] D57626: Disallow trivial_abi on a class if all copy and move constructors are deleted

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 4 15:09:32 PST 2019

rsmith added a comment.

In D57626#1382391 <https://reviews.llvm.org/D57626#1382391>, @Quuxplusone wrote:

> I admit that this `lock_guard` example is contrived and generally ill-advised <https://quuxplusone.github.io/blog/2018/11/12/parameter-lifetime-and-trivial-abi/>, but its ill-advisedness seems like a higher-level concern that shouldn't be "enforced" by fiddling with the rules of [[trivial_abi]], so I hope that's not what's going on here.

`[[trivial_abi]]` (at least right now) only affects whether user-provided special member functions are considered to be trivial for ABI purposes. A class whose copy and move constructor are both deleted is not passed in registers by the ABI; that has nothing to do with triviality, so it's unaffected by `[[trivial_abi]]` as currently specified. We could "fiddle with the rules of [[trivial_abi]]" to *make* that work (that's what the previous approach for this case did), but as you note, this is an ill-advised case, and fiddling with the rules to give it special behavior doesn't seem like worthwhile complexity. Our design intent was to produce a diagnostic if `[[trivial_abi]]` is specified on a non-template class that we can't actually pass in registers; this patch fixes a hole in our implementation of that design by adding a missing diagnostic.

  rC Clang



More information about the cfe-commits mailing list