[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#218803: gcc: (possible) bogus expansion of dynamic arrays within switch statements



Package: gcc-3.3

[This is also present in gcc-3.2, and probably all 3.x versions; it is
inapplicable for 2.95, which didn't support dynamic arrays]

int main(void)
{
  int foo = 0;
  int bar;
  int len = 5;
  switch(foo)
    {
    case 0:
      bar = 1;
      char buf[len];
    }
}

asuffield@cyclone:~$ gcc-3.2 -g -o foo foo.c
foo.c: In function `main':
foo.c:6: warning: unreachable code at beginning of switch statement

Note that this only occurs at -g2 or higher; I'm not sure why offhand.

The line number is at best misleading; the complaint is about the
scope of the dynamic array buf.

I haven't investigated it, because I'm mildly familiar with the code
in gcc that's responsible (most of gcc/stmt.c), and it's utterly
disgusting. However, I recognise the symptoms; it is likely that the
code to set up the dynamic array has been inserted at the top of the
binding contour - between the { and the case - which is invalid, as
that space is always jumped over. This is supported by observing that
if you manually insert a new contour, the warning disappears:

int main(void)
{
  int foo = 0;
  int bar;
  int len = 5;
  switch(foo)
    {
    case 0:
      {
        bar = 1;
        char buf[len];
      }
    }
}

I'm not sure whether the original code is supposed to compile or not;
I suspect that it currently miscompiles. What the heck is the scope of
a variable declared in this position?

-- 
  .''`.  ** Debian GNU/Linux ** | Andrew Suffield
 : :' :  http://www.debian.org/ |
 `. `'                          |
   `-             -><-          |

Attachment: signature.asc
Description: Digital signature


Reply to: