public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-05 13:06 rcampbell
  0 siblings, 0 replies; 6+ messages in thread
From: rcampbell @ 2002-12-05 13:06 UTC (permalink / raw)
  To: gcc-gnats


>Number:         8828
>Category:       c
>Synopsis:       gcc reports some code is unreachable when it is not
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    unassigned
>State:          open
>Class:          rejects-legal
>Submitter-Id:   net
>Arrival-Date:   Thu Dec 05 13:06:00 PST 2002
>Closed-Date:
>Last-Modified:
>Originator:     Rolf Campbell
>Release:        GNU C version 3.2 20020927 (prerelease) (i686-pc-cygwin)
>Organization:
>Environment:
Cygwin 1.3.17 running under Win2000 (SP3)
>Description:
When gcc is run with "-Wunreachable-code", certain reachable code sections involving switch's generate warnings about unreachable code.

Here's "a.i"
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "a.c"
int b;

int func(int a)
{
  int j = 2;
  switch(a) {
    case 0:
      for(j=0; j<b; j++)
        j++;
      break;
    case 1:
      for(j=0; j<3; j++)
        j++;
      break;
  }
  return j;
}

When I compile it with
gcc -v -save-temps -Wunreachable-code -c a.c

I get:
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/3.2/specs
Configured with: /netrel/src/gcc-3.2-3/configure --enable-languages=c,c++,f77,java --enable-libgcj --enable-threads=posix --with-system-zlib --enable-nls --without-included-gettext --enable-interpreter --disable-sjlj-exceptions --disable-version-specific-runtime-libs --enable-shared --build=i686-pc-linux --host=i686-pc-cygwin --target=i686-pc-cygwin --enable-haifa --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --includedir=/nonexistent/include --libexecdir=/usr/sbin
Thread model: posix
gcc version 3.2 20020927 (prerelease)
 /usr/lib/gcc-lib/i686-pc-cygwin/3.2/cpp0.exe -lang-c -v -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -D_X86_=1 -D_X86_=1 -Asystem=winnt -D__NO_INLINE__ -D__STDC_HOSTED__=1 -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ -D__tune_pentium2__ -D__tune_pentium3__ -D__stdcall=__attribute__((__stdcall__)) -D__fastcall=__attribute__((__fastcall__)) -D__cdecl=__attribute__((__cdecl__)) -D_stdcall=__attribute__((__stdcall__)) -D_fastcall=__attribute__((__fastcall__)) -D_cdecl=__attribute__((__cdecl__)) -D__declspec(x)=__attribute__((x)) -D__i386__ -D__i386 -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -isystem /usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../../include/w32api -isystem /usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../../i686-pc-cygwin/lib/../../include/w32api a.c -Wunreachable-code a.i
GNU CPP version 3.2 20020927 (prerelease) (cpplib) (80386, BSD syntax)
ignoring nonexistent directory "/usr/i686-pc-cygwin/include"
ignoring duplicate directory "/usr/i686-pc-cygwin/lib/../../include/w32api"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/w32api
 /usr/local/include
 /usr/lib/gcc-lib/i686-pc-cygwin/3.2/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i686-pc-cygwin/3.2/cc1.exe -fpreprocessed a.i -quiet -dumpbase a.c -Wunreachable-code -version -o a.s
GNU CPP version 3.2 20020927 (prerelease) (cpplib) (80386, BSD syntax)
GNU C version 3.2 20020927 (prerelease) (i686-pc-cygwin)
        compiled by GNU C version 3.2 20020927 (prerelease).
a.c: In function `func':
a.c:10: warning: will never be executed
a.c:14: warning: will never be executed
>How-To-Repeat:

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-06 17:06 Christian Ehrhardt
  0 siblings, 0 replies; 6+ messages in thread
From: Christian Ehrhardt @ 2002-12-06 17:06 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c/8828; it has been noted by GNATS.

From: "Christian Ehrhardt" <ehrhardt@mathematik.uni-ulm.de>
To: Rolf Campbell <rcampbell@tropicnetworks.com>
Cc: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
  nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org
Subject: Re: c/8828: gcc reports some code is unreachable when it is not
Date: Sat, 7 Dec 2002 01:58:19 +0100

 On Fri, Dec 06, 2002 at 11:22:32AM -0500, Rolf Campbell wrote:
 > But, this was compiled WITHOUT optimizations (gcc -Wunreachable-code -c
 > a.c), so there should be no removal of superfluous code, or folding of
 > break statements.
 
 Even without optimization it is possible that some code is unused
 and removed. In this particular case the following case statement
 
 switch (i) {
 case 0:
    for (; i<2; i++)
       x++
    break;
 case 1:
    x++;break;
 }
 
 Is rewritten to look like this (even without optimization this is allowed):
 switch (i) {
 case 0:
 startfor:
    if (i>=2)
       goto caseend;
    x++; i++;
    goto startfor;
    break;
 case 1:
    x++;break;
 }
 caseend:
 
 which makes the first break statement unreachable. This is completly
 legal and the compiler is even right in some sense that the break
 statement is unreachable. Others should decide if this is actually a
 bug but the warning is off by default for a reason.
 
     regards   Christian
 
 -- 
 THAT'S ALL FOLKS!


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-06 15:56 Wolfgang Bangerth
  0 siblings, 0 replies; 6+ messages in thread
From: Wolfgang Bangerth @ 2002-12-06 15:56 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c/8828; it has been noted by GNATS.

From: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
To: gcc-gnats@gcc.gnu.org
Cc: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>,
   Volker Reichelt <reichelt@igpm.rwth-aachen.de>,
   <rcampbell@tropicnetworks.com>
Subject: Re: c/8828: gcc reports some code is unreachable when it is not
Date: Fri, 6 Dec 2002 17:48:13 -0600 (CST)

 Just for reference, I think this is actually a duplicate of PR 5230.
 
 -------------------------------------------------------------------------
 Wolfgang Bangerth              email:           bangerth@ticam.utexas.edu
                                www: http://www.ticam.utexas.edu/~bangerth
 
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-06  8:26 Rolf Campbell
  0 siblings, 0 replies; 6+ messages in thread
From: Rolf Campbell @ 2002-12-06  8:26 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c/8828; it has been noted by GNATS.

From: "Rolf Campbell" <rcampbell@tropicnetworks.com>
To: "Christian Ehrhardt" <ehrhardt@mathematik.uni-ulm.de>,
	<reichelt@igpm.rwth-aachen.de>,
	<gcc-bugs@gcc.gnu.org>,
	<gcc-prs@gcc.gnu.org>,
	<nobody@gcc.gnu.org>,
	<gcc-gnats@gcc.gnu.org>
Cc:  
Subject: RE: c/8828: gcc reports some code is unreachable when it is not
Date: Fri, 6 Dec 2002 11:22:32 -0500

 But, this was compiled WITHOUT optimizations (gcc -Wunreachable-code -c
 a.c), so there should be no removal of superfluous code, or folding of
 break statements.
 
 -Rolf
 
 > -----Original Message-----
 > From: Christian Ehrhardt [mailto:ehrhardt@mathematik.uni-ulm.de]=20
 > Sent: Friday, December 06, 2002 11:14 AM
 > To: reichelt@igpm.rwth-aachen.de; gcc-bugs@gcc.gnu.org;=20
 > gcc-prs@gcc.gnu.org; nobody@gcc.gnu.org; Rolf Campbell;=20
 > gcc-gnats@gcc.gnu.org
 > Subject: Re: c/8828: gcc reports some code is unreachable=20
 > when it is not
 >=20
 >=20
 > On Fri, Dec 06, 2002 at 09:29:12AM -0000,=20
 > reichelt@igpm.rwth-aachen.de wrote:
 > >     An even shorter example is the following:
 > >    =20
 > >     -----------------snip here----------------
 > >     void foo(int i)
 > >     {
 > >       switch(i) {
 > >         case 0:
 > >           break;
 > >         case 1:
 > >           break;
 > >       }
 > >     }
 > >     -----------------snip here----------------
 > >    =20
 > >     Compiling this with gcc 3.2.1 or mainline I get the message
 > >    =20
 > >     PR8828.c: In function `foo':
 > >     PR8828.c:7: warning: will never be executed
 > >     PR8828.c:5: warning: will never be executed
 >=20
 > Looks like warnings removed by the optimizer. In this case=20
 > the optimizer will just remove both of the empty case labels=20
 > and warn that the instructions therein (the breaks) aren't=20
 > executed. In the original example the break is probably=20
 > folded into the for loop an then optimized away. I even=20
 > managed to get warnings for code like
 > this:
 >=20
 > switch (i) {
 > 	case 0:
 > 		x++;
 > 		break;
 > 	case 1:
 > 		x++;
 > 		break;
 > }
 >=20
 > where the optimizer tells me that it removed one of the x++=20
 > instructions probably because the two case labels were=20
 > combined. This is probably not a bug, the documentation=20
 > doesn't explicitly mention optimizations but it does mention=20
 > that inlined function may produce warning for code that is=20
 > unreachable only in a single inlined copy. This case looks=20
 > rather similar.
 >=20
 >    regards   Christian
 >=20
 > --=20
 > THAT'S ALL FOLKS!
 >=20


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-06  8:16 Christian Ehrhardt
  0 siblings, 0 replies; 6+ messages in thread
From: Christian Ehrhardt @ 2002-12-06  8:16 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c/8828; it has been noted by GNATS.

From: "Christian Ehrhardt" <ehrhardt@mathematik.uni-ulm.de>
To: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
  nobody@gcc.gnu.org, rcampbell@tropicnetworks.com, gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: c/8828: gcc reports some code is unreachable when it is not
Date: Fri, 6 Dec 2002 17:13:43 +0100

 On Fri, Dec 06, 2002 at 09:29:12AM -0000, reichelt@igpm.rwth-aachen.de wrote:
 >     An even shorter example is the following:
 >     
 >     -----------------snip here----------------
 >     void foo(int i)
 >     {
 >       switch(i) {
 >         case 0:
 >           break;
 >         case 1:
 >           break;
 >       }
 >     }
 >     -----------------snip here----------------
 >     
 >     Compiling this with gcc 3.2.1 or mainline I get the message
 >     
 >     PR8828.c: In function `foo':
 >     PR8828.c:7: warning: will never be executed
 >     PR8828.c:5: warning: will never be executed
 
 Looks like warnings removed by the optimizer. In this case the
 optimizer will just remove both of the empty case labels and warn
 that the instructions therein (the breaks) aren't executed. In
 the original example the break is probably folded into the for loop
 an then optimized away. I even managed to get warnings for code like
 this:
 
 switch (i) {
 	case 0:
 		x++;
 		break;
 	case 1:
 		x++;
 		break;
 }
 
 where the optimizer tells me that it removed one of the x++ instructions
 probably because the two case labels were combined. This is probably not
 a bug, the documentation doesn't explicitly mention optimizations but
 it does mention that inlined function may produce warning for code that
 is unreachable only in a single inlined copy. This case looks rather
 similar.
 
    regards   Christian
 
 -- 
 THAT'S ALL FOLKS!


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c/8828: gcc reports some code is unreachable when it is not
@ 2002-12-06  1:29 reichelt
  0 siblings, 0 replies; 6+ messages in thread
From: reichelt @ 2002-12-06  1:29 UTC (permalink / raw)
  To: gcc-bugs, gcc-prs, nobody, rcampbell

Synopsis: gcc reports some code is unreachable when it is not

State-Changed-From-To: open->analyzed
State-Changed-By: reichelt
State-Changed-When: Fri Dec  6 01:29:11 2002
State-Changed-Why:
    Confirmed.
    
    An even shorter example is the following:
    
    -----------------snip here----------------
    void foo(int i)
    {
      switch(i) {
        case 0:
          break;
        case 1:
          break;
      }
    }
    -----------------snip here----------------
    
    Compiling this with gcc 3.2.1 or mainline I get the message
    
    PR8828.c: In function `foo':
    PR8828.c:7: warning: will never be executed
    PR8828.c:5: warning: will never be executed
    
    i.e. the compiler complains about the "break" statements.
    
    This is a regression from gcc 3.0.4 where the warning is not issued.

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8828


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2002-12-07  1:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-12-05 13:06 c/8828: gcc reports some code is unreachable when it is not rcampbell
2002-12-06  1:29 reichelt
2002-12-06  8:16 Christian Ehrhardt
2002-12-06  8:26 Rolf Campbell
2002-12-06 15:56 Wolfgang Bangerth
2002-12-06 17:06 Christian Ehrhardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).