]> gcc.gnu.org Git - gcc.git/commit
c++: implement DR1363 and DR1496 for __is_trivial [PR85723]
authorMarek Polacek <polacek@redhat.com>
Tue, 18 Jun 2024 20:49:24 +0000 (16:49 -0400)
committerMarek Polacek <polacek@redhat.com>
Thu, 18 Jul 2024 19:06:15 +0000 (15:06 -0400)
commit9690fb3a43e5cf26a5fb853283d4200df312a640
tree38be8f7c124e1dcd3bc61d36bf367ac3b7ff377f
parent248e8530dd0298e9bbe099c651d5d9c4d2a0c0f9
c++: implement DR1363 and DR1496 for __is_trivial [PR85723]

is_trivial was introduced in
<https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2230.html>
which split POD into is_trivial and is_standard_layout.

Later came CWG 1363.  Since

  struct A {
    A() = default;
    A(int = 42) {}
  };

cannot be default-initialized, it should not be trivial, so the definition
of what is a trivial class changed.

Similarly, CWG 1496 concluded that

  struct B {
    B() = delete;
  }:

should not be trivial either.

P0848 adjusted the definition further to say "eligible".  That means
that

  template<typename T>
  struct C {
    C() requires false = default;
  };

should not be trivial, either, since C::C() is not eligible.

Bug 85723 reports that we implement none of the CWGs.

I chose to fix this by using type_has_non_deleted_trivial_default_ctor
which uses locate_ctor which uses build_new_method_call, which would
be used by default-initialization as well.  With that, all __is_trivial
problems I could find in the Bugzilla are fixed, except for PR96288,
which may need changes to trivially-copyable, so I'm not messing with
that now.

I hope this has no ABI implications.  There's effort undergoing to
remove "trivial class" from the core language as it's not really
meaningful.  So the impact of this change should be pretty low except
to fix a few libstdc++ problems.

PR c++/108769
PR c++/58074
PR c++/115522
PR c++/85723

gcc/cp/ChangeLog:

* class.cc (type_has_non_deleted_trivial_default_ctor): Fix formatting.
* tree.cc (trivial_type_p): Instead of TYPE_HAS_TRIVIAL_DFLT, use
type_has_non_deleted_trivial_default_ctor.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wclass-memaccess.C: Add dg-warning.
* g++.dg/ext/is_trivial1.C: New test.
* g++.dg/ext/is_trivial2.C: New test.
* g++.dg/ext/is_trivial3.C: New test.
* g++.dg/ext/is_trivial4.C: New test.
* g++.dg/ext/is_trivial5.C: New test.
* g++.dg/ext/is_trivial6.C: New test.
gcc/cp/class.cc
gcc/cp/tree.cc
gcc/testsuite/g++.dg/ext/is_trivial1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_trivial2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_trivial3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_trivial4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_trivial5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_trivial6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wclass-memaccess.C
This page took 0.060573 seconds and 6 git commands to generate.