re PR c++/35652 (offset warning should be given in the front-end)
authorJason Merrill <jason@redhat.com>
Wed, 3 Feb 2010 16:28:07 +0000 (11:28 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 3 Feb 2010 16:28:07 +0000 (11:28 -0500)
PR c++/35652
* builtins.c (c_strlen): Use EXPR_LOCATION in diagnostics.

From-SVN: r156469

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/g++.dg/warn/string1.C [new file with mode: 0644]

index 180d60431a1c0db490a2efaaab57cd92c212b738..8e5b7bc75f6c3fd8f6cd349b08d97e2ebe388043 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/35652
+       * builtins.c (c_strlen): Use EXPR_LOCATION in diagnostics.
+
 2010-02-03  Alexandre Oliva  <aoliva@redhat.com>
 
        PR debug/42896
index ac9693400e4a0159ef985b60336d27def6a78398..b6fd1ead0fb9d28bbc318024da289bc164bd67ec 100644 (file)
@@ -433,6 +433,7 @@ c_strlen (tree src, int only_value)
   HOST_WIDE_INT offset;
   int max;
   const char *ptr;
+  location_t loc;
 
   STRIP_NOPS (src);
   if (TREE_CODE (src) == COND_EXPR
@@ -450,6 +451,11 @@ c_strlen (tree src, int only_value)
       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
     return c_strlen (TREE_OPERAND (src, 1), only_value);
 
+  if (EXPR_HAS_LOCATION (src))
+    loc = EXPR_LOCATION (src);
+  else
+    loc = input_location;
+
   src = string_constant (src, &offset_node);
   if (src == 0)
     return NULL_TREE;
@@ -475,7 +481,7 @@ c_strlen (tree src, int only_value)
         and return that.  This would perhaps not be valid if we were dealing
         with named arrays in addition to literal string constants.  */
 
-      return size_diffop_loc (input_location, size_int (max), offset_node);
+      return size_diffop_loc (loc, size_int (max), offset_node);
     }
 
   /* We have a known offset into the string.  Start searching there for
@@ -494,7 +500,7 @@ c_strlen (tree src, int only_value)
      /* Suppress multiple warnings for propagated constant strings.  */
       if (! TREE_NO_WARNING (src))
         {
-          warning (0, "offset outside bounds of constant string");
+          warning_at (loc, 0, "offset outside bounds of constant string");
           TREE_NO_WARNING (src) = 1;
         }
       return NULL_TREE;
diff --git a/gcc/testsuite/g++.dg/warn/string1.C b/gcc/testsuite/g++.dg/warn/string1.C
new file mode 100644 (file)
index 0000000..3027727
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/35652
+// { dg-options "-O" }
+
+#include <string>
+int main() {
+  // blank line padding, could also be code...
+  //
+  //
+  //
+  //
+  //
+  //
+  //
+  //
+  //
+  std::string s = "";
+  s += 'x' + "y";            // { dg-warning "bounds of constant string" }
+}