https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
Filipe Brandenburger <filbranden at google dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |filbranden at google dot com
--- Comment #2 from Filipe Brandenburger <filbranden at google dot com> ---
It turns out clang from LLVM seems to do the right thing here...
Using this as a test case:
__attribute__((warn_unused_result))
int foo() {
return -1;
}
int should_not_warn() {
return foo();
}
int should_warn() {
foo();
return 0;
}
int void_cast_should_not_warn() {
(void) foo();
return 0;
}
With gcc 5.1:
$ gcc -c test.c
test.c: In function ‘should_warn’:
test.c:12:4: warning: ignoring return value of ‘foo’, declared with attribute
warn_unused_result [-Wunused-result]
foo();
^
test.c: In function ‘void_cast_should_not_warn’:
test.c:17:4: warning: ignoring return value of ‘foo’, declared with attribute
warn_unused_result [-Wunused-result]
(void) foo();
^
With clang 3.5:
$ clang-3.5 -c test.c
test.c:12:4: warning: ignoring return value of function declared with
warn_unused_result attribute [-Wunused-result]
foo();
^~~
1 warning generated.
Other static analysis tools seem to also take a hint out of the (void) cast.
I mean, why make the programmer jump through hoops and store the return value
in an unused variable? Isn't the (void) cast more explicit than that anyways?
Right now the only choice I can see is to use -Wno-unused-result which
basically makes the feature useless when building using gcc...
Richard Blener proposed a patch here:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509#c10
Would it make sense to adopt that patch?
Cheers,
Filipe