https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425

--- Comment #48 from Andrew Church <achurch+gcc at achurch dot org> ---
(In reply to rusty from comment #47)
> Civility please.

I have no intention of trying to start a fight :)  Like you, I'm just trying to
improve the situation, and knowing that in my own open-source work I'm always
happier when a user offers a patch instead of just a "please fix this", I've
done the same here.  That said, since I _am_ trying to improve the situation, I
won't step back from debating the utility of the change if the developer
disagrees.  (And I freely admit that I can be tempted into a bit of snark from
time to time...)

> But accept that the
> conversation on this issue is only a weak indication of consensus.

I agree, which is why I gave other examples such as Clang's behavior and
especially the C++/C2x standards.  While I grant that even standards committees
are small subsets of the total user community and are not immune to poor
decision-making, I'd consider the facts that (1) the C++17 description of
[[nodiscard]] called out void casts as a case which should not be diagnosed,
(2) C++20 expanded on that with an explicit example of a cast-to-void call not
being diagnosed, and (3) C2x, as of the current draft, also includes the
call-out of void casts from C++17 (though not the explicit example from C++20),
to collectively be a much stronger indicator of that consensus.

> As Andrew Pinski says "people are mis-using this attribute", and Jakub
> Jelinek makes a similar point.  The use of _wur has changed from "ignoring
> the result is criminally wrong" to "possibly wrong".

I think "mis-using" is a bit harsh; the core concept (warning about a discarded
return value) is a useful one, as evidenced by the feature's adoption into C++
and subsequently C2x.  I grant that it's being used for a wider variety of
purposes than originally intended, but since there was no other option until
the relatively recent addition of [[nodiscard]], that's what people went with.

I was thinking about adding a suggestion for multiple levels of warning, such
as "ignoring this is almost certainly wrong" (e.g. realloc()) vs "ignoring this
could be dangerous, you might want to doublecheck" (e.g. system()); in fact,
[[nodiscard]] is effectively that since void casts do silence [[nodiscard]]
warnings in GCC, though I don't know if the difference in behavior from _wur is
intentional.  But that ultimately wouldn't do anything about the present
problem, which is API developers and users disagreeing on whether a return
value is safe to discard - it might morph into something like "why is this
function marked with the stricter _wur when it should just be [[nodiscard]]",
and we're back to wanting to selectively silence _wur warnings again.

Reply via email to