C++ FE: Show both locations in string literal concatenation error
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 20 Jun 2016 16:37:28 +0000 (16:37 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Mon, 20 Jun 2016 16:37:28 +0000 (16:37 +0000)
gcc/cp/ChangeLog:
* parser.c (cp_parser_string_literal): Convert non-standard
concatenation error to directly use a rich_location, and
use that to add the location of the first literal to the
diagnostic.

gcc/testsuite/ChangeLog:
* g++.dg/diagnostic/string-literal-concat.C: New test case.

From-SVN: r237608

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/string-literal-concat.C [new file with mode: 0644]

index 8ff9630e866b3c9eea29c22b48147dda0132e77c..6508b6ed03ef193d42aace343a1c014f9432b216 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-20  David Malcolm  <dmalcolm@redhat.com>
+
+       * parser.c (cp_parser_string_literal): Convert non-standard
+       concatenation error to directly use a rich_location, and
+       use that to add the location of the first literal to the
+       diagnostic.
+
 2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * decl.c (validate_constexpr_redeclaration): Change pair of errors
index 0846f0c04ea1f5c1ccdaa460eb4e27a0077d242a..d1f06fdb86107f11f531d11d6f5bdb02737bf8f9 100644 (file)
@@ -3893,13 +3893,12 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
     }
   else
     {
-      location_t last_tok_loc;
+      location_t last_tok_loc = tok->location;
       gcc_obstack_init (&str_ob);
       count = 0;
 
       do
        {
-         last_tok_loc = tok->location;
          cp_lexer_consume_token (parser->lexer);
          count++;
          str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree);
@@ -3931,13 +3930,19 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
              if (type == CPP_STRING)
                type = curr_type;
              else if (curr_type != CPP_STRING)
-               error_at (tok->location,
-                         "unsupported non-standard concatenation "
-                         "of string literals");
+               {
+                 rich_location rich_loc (line_table, tok->location);
+                 rich_loc.add_range (last_tok_loc, false);
+                 error_at_rich_loc (&rich_loc,
+                                    "unsupported non-standard concatenation "
+                                    "of string literals");
+               }
            }
 
          obstack_grow (&str_ob, &str, sizeof (cpp_string));
 
+         last_tok_loc = tok->location;
+
          tok = cp_lexer_peek_token (parser->lexer);
          if (cpp_userdef_string_p (tok->type))
            {
index 0570b224f21b215dacf07bae7ebe8c2e4348a237..1d438528a07b7d894c742abac472fe4412c30150 100644 (file)
@@ -1,3 +1,7 @@
+2016-06-20  David Malcolm  <dmalcolm@redhat.com>
+
+       * g++.dg/diagnostic/string-literal-concat.C: New test case.
+
 2016-06-20  Martin Sebor  <msebor@redhat.com>
 
        PR c/69507
diff --git a/gcc/testsuite/g++.dg/diagnostic/string-literal-concat.C b/gcc/testsuite/g++.dg/diagnostic/string-literal-concat.C
new file mode 100644 (file)
index 0000000..4ede799
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-options "-fdiagnostics-show-caret -std=c++11" } */
+
+const void *s = u8"a"  u"b";  // { dg-error "24: non-standard concatenation" }
+/* { dg-begin-multiline-output "" }
+ const void *s = u8"a"  u"b";
+                 ~~~~~  ^~~~
+   { dg-end-multiline-output "" } */
+
+const void *s2 = u"a"  u"b"  u8"c";  // { dg-error "30: non-standard concatenation" }
+/* { dg-begin-multiline-output "" }
+ const void *s2 = u"a"  u"b"  u8"c";
+                        ~~~~  ^~~~~
+  { dg-end-multiline-output "" } */
+
+#define TEST_U8_LITERAL u8"a"
+
+const void *s3 = TEST_U8_LITERAL u8"b";
+
+const void *s4 = TEST_U8_LITERAL u"b"; // { dg-error "34: non-standard concatenation" }
+/* { dg-begin-multiline-output "" }
+ const void *s4 = TEST_U8_LITERAL u"b";
+                                  ^~~~
+  { dg-end-multiline-output "" } */