From: Roger Sayle Date: Thu, 16 Dec 2004 14:42:49 +0000 (+0000) Subject: re PR middle-end/18493 (gcc doesn't like switch blocks without case/default labels) X-Git-Tag: releases/gcc-3.4.4~396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9537039630317ba977ab1a37ce41062873c597a;p=thirdparty%2Fgcc.git re PR middle-end/18493 (gcc doesn't like switch blocks without case/default labels) PR middle-end/18493 * c-typeck.c (c_finish_case): Rechain statements if we didn't encounter any case labels or a default. * gcc.dg/switch-4.c: New test case. From-SVN: r92264 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b706e913d67e..e88b721f91fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-16 Roger Sayle + + PR middle-end/18493 + * c-typeck.c (c_finish_case): Rechain statements if we didn't + encounter any case labels or a default. + 2004-12-16 Eric Botcazou PR middle-end/18882 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index dd06fda7ac22..b4cf22d86311 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -6551,6 +6551,14 @@ c_finish_case (void) { struct c_switch *cs = switch_stack; + /* If we've not seen any case labels (or a default), we may still + need to chain any statements that were seen as the SWITCH_BODY. */ + if (SWITCH_BODY (cs->switch_stmt) == NULL) + { + SWITCH_BODY (cs->switch_stmt) = TREE_CHAIN (cs->switch_stmt); + TREE_CHAIN (cs->switch_stmt) = NULL_TREE; + } + /* Rechain the next statements to the SWITCH_STMT. */ last_tree = cs->switch_stmt; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 625283658e8a..a725b3d4ac6a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-16 Roger Sayle + + PR middle-end/18493 + * gcc.dg/switch-4.c: New test case. + 2004-12-16 Wolfgang Bangerth * g++.dg/other/complex1.C: New test. diff --git a/gcc/testsuite/gcc.dg/switch-4.c b/gcc/testsuite/gcc.dg/switch-4.c index f2d85300d90f..fcb3f602ee56 100644 --- a/gcc/testsuite/gcc.dg/switch-4.c +++ b/gcc/testsuite/gcc.dg/switch-4.c @@ -1,24 +1,10 @@ -/* PR middle-end/17657 */ -/* { dg-do compile } */ -/* { dg-options "-O2" } */ +/* PR middle-end/18493 */ +/* { dg-do link } */ -extern signed char foo(int); - -void bar (void) -{ - signed char tmp = foo (0); - int t1 = tmp; - switch (t1) - { - case 1: foo (1); break; - case 2: foo (2); break; - case 3: foo (3); break; - case 4: foo (4); break; - case 5: foo (5); break; - case 6: foo (6); break; - case 7: foo (7); break; - case 255: foo (8); break; - default: break; - } +int main() { +goto bug; +switch(0) { +bug: return 0; +} }