Commit 842107e4 by David Malcolm Committed by David Malcolm

C++ FE: Show both locations in string literal concatenation error

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
parent 9ee6540a
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> 2016-06-17 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (validate_constexpr_redeclaration): Change pair of errors * decl.c (validate_constexpr_redeclaration): Change pair of errors
......
...@@ -3893,13 +3893,12 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, ...@@ -3893,13 +3893,12 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
} }
else else
{ {
location_t last_tok_loc; location_t last_tok_loc = tok->location;
gcc_obstack_init (&str_ob); gcc_obstack_init (&str_ob);
count = 0; count = 0;
do do
{ {
last_tok_loc = tok->location;
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
count++; count++;
str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree); 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, ...@@ -3931,13 +3930,19 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
if (type == CPP_STRING) if (type == CPP_STRING)
type = curr_type; type = curr_type;
else if (curr_type != CPP_STRING) else if (curr_type != CPP_STRING)
error_at (tok->location, {
"unsupported non-standard concatenation " rich_location rich_loc (line_table, tok->location);
"of string literals"); 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)); obstack_grow (&str_ob, &str, sizeof (cpp_string));
last_tok_loc = tok->location;
tok = cp_lexer_peek_token (parser->lexer); tok = cp_lexer_peek_token (parser->lexer);
if (cpp_userdef_string_p (tok->type)) if (cpp_userdef_string_p (tok->type))
{ {
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> 2016-06-20 Martin Sebor <msebor@redhat.com>
PR c/69507 PR c/69507
......
/* { 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 "" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment