]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/18493 (gcc doesn't like switch blocks without case/default labels)
authorRoger Sayle <roger@eyesopen.com>
Thu, 16 Dec 2004 14:42:49 +0000 (14:42 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Thu, 16 Dec 2004 14:42:49 +0000 (14:42 +0000)
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

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/switch-4.c

index b706e913d67ec1ba482c75d9ae3d74b4aae5fe74..e88b721f91fc7b76081f5f316311c378f4e2055d 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-16  Roger Sayle  <roger@eyesopen.com>
+
+       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  <ebotcazou@adacore.com>
 
        PR middle-end/18882
index dd06fda7ac22c49f5a6393ab4abc0d01207ecc7e..b4cf22d8631121c78cd5f8ffa9c26843f8e89130 100644 (file)
@@ -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;
 
index 625283658e8af0fb5f163c27802e4551b10c247f..a725b3d4ac6ae4ac0e1f56da07c448d7e4bf6d16 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-16  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/18493
+       * gcc.dg/switch-4.c: New test case.
+
 2004-12-16  Wolfgang Bangerth  <bangerth@dealii.com>
 
        * g++.dg/other/complex1.C: New test.
index f2d85300d90ffdfc164230307e023ba4ec307f2b..fcb3f602ee56b0051f35046153886ec23f7ab2c7 100644 (file)
@@ -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;
+}
 }