This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/86286] Could __attribute__ ((nothrow)) on a noexcept function turn off EH codegen?
- From: "redi at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 25 Jun 2018 12:14:09 +0000
- Subject: [Bug c++/86286] Could __attribute__ ((nothrow)) on a noexcept function turn off EH codegen?
- Auto-submitted: auto-generated
- References: <bug-86286-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86286
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> Isn't noexcept mapped to nothrow currently?
The case I'm concerned about is this (I forgot to add it to the original
submission, sorry):
int g (int i);
int goo (int i) noexcept { return g (i); }
The function 'g' doesn't have noexcept or nothrow. Because 'goo' does have
noexcept, it needs to handle any exceptions and call std::terminate (the
must-not-throw EH region).
> Don't you want a "elide-mnt-check" attribute on the caller instead?
> That is, we wrap all noexcept function bodies with a must-not-throw EH
> region and you want to elide that, no?
Yes. I want to elide the extra code from 'goo', without needing the wrapper
like:
inline int g2 (int i) __attribute__((always_inline,nothrow));
inline int g2 (int i) { return g(i); }
int good (int i) noexcept { return g2 (i); }
or the lambda like:
int good (int i) noexcept {
return [&]() __attribute__((nothrow)) { return g (i); }();
}
A new attribute could be used for that. My original thought was that reusing
__attribute__((nothrow)) somehow could work too. Maybe it's not a good idea as
a function attribute though, if the function is already marked nothrow because
it's noexcept.
So maybe a statement attribute as the first statement in a function could be
interpreted as elide-mnt-check:
int good (int i) noexcept {
__attribute__((nothrow));
return g2 (i);
}