OSDN Git Service

PR c/39613
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Apr 2009 00:20:08 +0000 (00:20 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Apr 2009 00:20:08 +0000 (00:20 +0000)
* c-typeck.c (do_case): If case label is not an INTEGER_CST, fold
it and pedwarn if this results in an INTEGER_CST.

testsuite:
* gcc.dg/case-const-1.c, gcc.dg/case-const-2.c,
gcc.dg/case-const-3.c: New tests.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145793 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/case-const-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/case-const-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/case-const-3.c [new file with mode: 0644]

index e997af5..feedc5c 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-09  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/39613
+       * c-typeck.c (do_case): If case label is not an INTEGER_CST, fold
+       it and pedwarn if this results in an INTEGER_CST.
+
 2009-04-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * doc/install.texi: Update minimum GMP version.  Remove obsolete
index b2bb74f..9c74bf3 100644 (file)
@@ -7851,6 +7851,22 @@ do_case (tree low_value, tree high_value)
 {
   tree label = NULL_TREE;
 
+  if (low_value && TREE_CODE (low_value) != INTEGER_CST)
+    {
+      low_value = c_fully_fold (low_value, false, NULL);
+      if (TREE_CODE (low_value) == INTEGER_CST)
+       pedwarn (input_location, OPT_pedantic,
+                "case label is not an integer constant expression");
+    }
+
+  if (high_value && TREE_CODE (high_value) != INTEGER_CST)
+    {
+      high_value = c_fully_fold (high_value, false, NULL);
+      if (TREE_CODE (high_value) == INTEGER_CST)
+       pedwarn (input_location, OPT_pedantic,
+                "case label is not an integer constant expression");
+    }
+
   if (c_switch_stack && !c_switch_stack->blocked_stmt_expr
       && !c_switch_stack->blocked_vm)
     {
index 7808aa5..2734327 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-09  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/39613
+       * gcc.dg/case-const-1.c, gcc.dg/case-const-2.c,
+       gcc.dg/case-const-3.c: New tests.
+
 2009-04-08  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c99-stdint-1.c: Fix cut-and-paste mistakes in test.
diff --git a/gcc/testsuite/gcc.dg/case-const-1.c b/gcc/testsuite/gcc.dg/case-const-1.c
new file mode 100644 (file)
index 0000000..ba39d09
--- /dev/null
@@ -0,0 +1,15 @@
+/* Test for case labels not integer constant expressions but folding
+   to integer constants (used in Linux kernel, PR 39613).  */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+extern int i;
+void
+f (int c)
+{
+  switch (c)
+    {
+    case (1 ? 1 : i):
+      ;
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/case-const-2.c b/gcc/testsuite/gcc.dg/case-const-2.c
new file mode 100644 (file)
index 0000000..9c119b0
--- /dev/null
@@ -0,0 +1,15 @@
+/* Test for case labels not integer constant expressions but folding
+   to integer constants (used in Linux kernel, PR 39613).  */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+extern int i;
+void
+f (int c)
+{
+  switch (c)
+    {
+    case (1 ? 1 : i): /* { dg-warning "case label is not an integer constant expression" } */
+      ;
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/case-const-3.c b/gcc/testsuite/gcc.dg/case-const-3.c
new file mode 100644 (file)
index 0000000..7224cca
--- /dev/null
@@ -0,0 +1,15 @@
+/* Test for case labels not integer constant expressions but folding
+   to integer constants (used in Linux kernel, PR 39613).  */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+extern int i;
+void
+f (int c)
+{
+  switch (c)
+    {
+    case (1 ? 1 : i): /* { dg-error "case label is not an integer constant expression" } */
+      ;
+    }
+}