[Bug c++/96090] noexcept operator of potentially-throwing defaulted function gives the wrong result

2021-08-28 Thread johelegp at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96090

Johel Ernesto Guerrero Peña  changed:

   What|Removed |Added

  Known to fail||10.3.0, 11.2.0, 12.0
   Keywords||rejects-valid
Summary|Inconsistent querying of|noexcept operator of
   |differring exception|potentially-throwing
   |specifications of   |defaulted function gives
   |explicitly defaulted|the wrong result
   |functions   |

--- Comment #1 from Johel Ernesto Guerrero Peña  ---
Now they all give the wrong answer: https://godbolt.org/z/hroWqTExz.

[Bug c++/96090] noexcept operator of potentially-throwing defaulted function gives the wrong result

2023-12-10 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96090

--- Comment #3 from GCC Commits  ---
The master branch has been updated by Nathaniel Shead :

https://gcc.gnu.org/g:4719b6f5ae4d758f193a17bbd5fb6cbacd702a23

commit r14-6395-g4719b6f5ae4d758f193a17bbd5fb6cbacd702a23
Author: Nathaniel Shead 
Date:   Sat Oct 28 16:04:52 2023 +1100

c++: Fix noexcept checking for trivial operations [PR96090]

This patch stops eager folding of trivial operations (construction and
assignment) from occurring when checking for noexceptness. This was
previously done in PR c++/53025, but only for copy/move construction,
and the __is_nothrow_xible builtins did not receive the same treatment
when they were added.

To handle `is_nothrow_default_constructible`, the patch also ensures
that when no parameters are passed we do value initialisation instead of
just building the constructor call: in particular, value-initialisation
doesn't necessarily actually invoke the constructor for trivial default
constructors, and so we need to handle this case as well.

This is contrary to the proposed resolution of CWG2820; for now we just
ensure it matches the behaviour of the `noexcept` operator and create
testcases formalising this, and if that issue gets accepted we can
revisit.

PR c++/96090
PR c++/100470

gcc/cp/ChangeLog:

* call.cc (build_over_call): Prevent folding of trivial special
members when checking for noexcept.
* method.cc (constructible_expr): Perform value-initialisation
for empty parameter lists.
(is_nothrow_xible): Treat as noexcept operator.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/noexcept81.C: New test.
* g++.dg/ext/is_nothrow_constructible7.C: New test.
* g++.dg/ext/is_nothrow_constructible8.C: New test.

Signed-off-by: Nathaniel Shead 

[Bug c++/96090] noexcept operator of potentially-throwing defaulted function gives the wrong result

2024-02-06 Thread mpolacek at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96090

Marek Polacek  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Marek Polacek  ---
Fixed, I guess.

[Bug c++/96090] noexcept operator of potentially-throwing defaulted function gives the wrong result

2023-10-28 Thread nathanieloshead at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96090

Nathaniel Shead  changed:

   What|Removed |Added

 CC||nathanieloshead at gmail dot 
com

--- Comment #2 from Nathaniel Shead  ---
I'm working on a patch for this. But worth noting...

> static_assert(!is_nothrow_default_constructible_v);
I'm not sure this is correct. By https://eel.is/c++draft/meta.unary.prop#9 this
is testing noexceptness of value-initialisation. And
https://eel.is/c++draft/dcl.init.general#9.1 says

> if T has either no default constructor ([class.default.ctor]) or
>a default constructor that is user-provided or deleted, then
>the object is default-initialized;
> otherwise, the object is zero-initialized and the semantic constraints
>for default-initialization are checked, and if T has a non-trivial
>default constructor, the object is default-initialized;
Since the default constructor here is not user-provided, and also trivial, the
object should not be default-initialized and thus the default constructor is
not called, and thus this is not potentially-throwing.