]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-common.c (check_case_value): Add location_t parameter.
authorMarek Polacek <polacek@redhat.com>
Sun, 3 Aug 2014 12:23:03 +0000 (12:23 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Sun, 3 Aug 2014 12:23:03 +0000 (12:23 +0000)
* c-common.c (check_case_value):  Add location_t parameter.  Use it.
(c_add_case_label): Pass loc to check_case_value.

* gcc.dg/case-bogus-1.c: New test.

From-SVN: r213525

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/case-bogus-1.c [new file with mode: 0644]

index ff788591328f5bc391f321ab09f2dbac62cf924a..b599627c397744386f6c6e005e8b77b0936965f3 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-03  Marek Polacek  <polacek@redhat.com>
+
+       * c-common.c (check_case_value):  Add location_t parameter.  Use it.
+       (c_add_case_label): Pass loc to check_case_value.
+
 2014-08-02  Trevor Saunders  <tsaunders@mozilla.com>
 
        * cilk.c: Use hash_map instead of pointer_map.
index b2a053ed6297a540dfc1679fc1cdb9f810193a82..acc9a203d557507bbf783b512fa562d0f4f7e844 100644 (file)
@@ -300,7 +300,7 @@ const struct fname_var_t fname_vars[] =
 struct visibility_flags visibility_options;
 
 static tree c_fully_fold_internal (tree expr, bool, bool *, bool *);
-static tree check_case_value (tree);
+static tree check_case_value (location_t, tree);
 static bool check_case_bounds (location_t, tree, tree, tree *, tree *);
 
 static tree handle_packed_attribute (tree *, tree, tree, int, bool *);
@@ -3349,7 +3349,7 @@ verify_sequence_points (tree expr)
 /* Validate the expression after `case' and apply default promotions.  */
 
 static tree
-check_case_value (tree value)
+check_case_value (location_t loc, tree value)
 {
   if (value == NULL_TREE)
     return value;
@@ -3359,7 +3359,7 @@ check_case_value (tree value)
     value = perform_integral_promotions (value);
   else if (value != error_mark_node)
     {
-      error ("case label does not reduce to an integer constant");
+      error_at (loc, "case label does not reduce to an integer constant");
       value = error_mark_node;
     }
 
@@ -5993,14 +5993,14 @@ c_add_case_label (location_t loc, splay_tree cases, tree cond, tree orig_type,
   type = TREE_TYPE (cond);
   if (low_value)
     {
-      low_value = check_case_value (low_value);
+      low_value = check_case_value (loc, low_value);
       low_value = convert_and_check (loc, type, low_value);
       if (low_value == error_mark_node)
        goto error_out;
     }
   if (high_value)
     {
-      high_value = check_case_value (high_value);
+      high_value = check_case_value (loc, high_value);
       high_value = convert_and_check (loc, type, high_value);
       if (high_value == error_mark_node)
        goto error_out;
index 68c4cf67759f7830434cdc6e09dd10a0c19285aa..d18aed8ee1b74accb846cedbbc3de57c2df2d3d4 100644 (file)
@@ -1,3 +1,7 @@
+2014-08-03  Marek Polacek  <polacek@redhat.com>
+
+       * gcc.dg/case-bogus-1.c: New test.
+
 2014-08-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/15339
diff --git a/gcc/testsuite/gcc.dg/case-bogus-1.c b/gcc/testsuite/gcc.dg/case-bogus-1.c
new file mode 100644 (file)
index 0000000..548312e
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+void
+foo (int n)
+{
+  switch (n)
+    case 0: case 3: case 0.2: case 5:; /* { dg-error "21:case label does not reduce to an integer constant" } */
+}