This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/31878] New: Spurious warnings generated due to not optimizing first
- From: "lloyd at randombit dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 9 May 2007 13:12:21 -0000
- Subject: [Bug c/31878] New: Spurious warnings generated due to not optimizing first
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
$ cat return.c
#include <assert.h>
int f(int x) {
if(x)
return x;
assert(x);
}
$ gcc -O2 -c -Wall -W return.c
return.c: In function ?int f(int)?:
return.c:9: warning: control reaches end of non-void function
The call to assert expands to (glibc 2.4):
(static_cast<void> ((x) ? 0 : (__assert_fail ("x", "return.c", 8,
__PRETTY_FUNCTION__), 0)));
So unless I'm missing something f() is equivalent to:
if(x)
return x;
else
__assert_fail(/* etc */);
However when explicitly written in this way, we don't get a warning:
$ cat return2.c
#include <assert.h>
int f(int x)
{
if(x)
return x;
else
__assert_fail ("x", __FILE__, __LINE__, __PRETTY_FUNCTION__);
}
$ gcc -O2 -Wall -c return2.c
$
Looking at the produced assembly on an x86-64 system, GCC is only performing
the comparison once (when optimizing), so it should see that there is no
codepath that doesn't either return or call a noreturn function. However I'm
guessing warnings are generated prior to the optimizer running and thus don't
see this?
Marked as Severity: trivial because one can always insert a dummy return after
the assert. Which is good because AFAICT fixing this would require rewriting
GCC. :)
--
Summary: Spurious warnings generated due to not optimizing first
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: trivial
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: lloyd at randombit dot net
GCC build triplet: x86_64-redhat-linux
GCC host triplet: x86_64-redhat-linux
GCC target triplet: x86_64-redhat-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31878