diff options
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index a17cc3f..032108a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4034,6 +4034,7 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, tree value; size_t count; struct obstack str_ob; + struct obstack loc_ob; cpp_string str, istr, *strs; cp_token *tok; enum cpp_ttype type, curr_type; @@ -4090,6 +4091,7 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, { location_t last_tok_loc = tok->location; gcc_obstack_init (&str_ob); + gcc_obstack_init (&loc_ob); count = 0; do @@ -4135,6 +4137,7 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, } obstack_grow (&str_ob, &str, sizeof (cpp_string)); + obstack_grow (&loc_ob, &tok->location, sizeof (location_t)); last_tok_loc = tok->location; @@ -4173,6 +4176,12 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, { value = build_string (istr.len, (const char *)istr.text); free (CONST_CAST (unsigned char *, istr.text)); + if (count > 1) + { + location_t *locs = (location_t *)obstack_finish (&loc_ob); + gcc_assert (g_string_concat_db); + g_string_concat_db->record_string_concatenation (count, locs); + } switch (type) { @@ -4209,7 +4218,10 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, value = error_mark_node; if (count > 1) - obstack_free (&str_ob, 0); + { + obstack_free (&str_ob, 0); + obstack_free (&loc_ob, 0); + } return cp_expr (value, loc); } |