From 070236f03795e1097dd291c3d606a0c27539fdf3 Mon Sep 17 00:00:00 2001 From: rth Date: Fri, 26 Apr 2002 07:40:12 +0000 Subject: * c-common.c (fix_string_type): Split out of ... (combine_strings): ... here. Take a varray, not a tree list. (c_expand_builtin_printf): Use fix_string_type. * c-common.h: Update decls. * c-parse.in (string): Remove. Update all uses to use STRING instead, and not call combine_strings. (yylexstring): New. (_yylex): Use it. * c-typeck.c (simple_asm_stmt): Don't call combine_strings. (build_asm_stmt): Likewise. * objc/objc-act.c (my_build_string): Use fix_string_type. (build_objc_string_object): Build varray for combine_strings. * parse.y (string): Remove. Update all uses to use STRING instead, and not call combine_strings. * rtti.c (tinfo_name): Use fix_string_type. * semantics.c (finish_asm_stmt): Don't call combine_strings. * spew.c (yylexstring): New. (read_token): Use it. * g++.dg/parse/concat1.C: New. * gcc.dg/concat2.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52790 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/parse.y | 46 +++++++++++++++++++--------------------------- gcc/cp/rtti.c | 2 +- gcc/cp/semantics.c | 3 --- gcc/cp/spew.c | 40 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 69 insertions(+), 32 deletions(-) (limited to 'gcc/cp') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 38b2f2255f3..607aa433fdb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2002-04-26 Richard Henderson + + PR c/3581 + * parse.y (string): Remove. Update all uses to use STRING + instead, and not call combine_strings. + * rtti.c (tinfo_name): Use fix_string_type. + * semantics.c (finish_asm_stmt): Don't call combine_strings. + * spew.c (yylexstring): New. + (read_token): Use it. + 2002-04-25 Richard Henderson PR c/2161 diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 5454353d874..2d8d0465cfb 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -378,7 +378,7 @@ cp_parse_init () %type PFUNCNAME maybe_identifier %type paren_expr_or_null nontrivial_exprlist SELFNAME %type expr_no_commas expr_no_comma_rangle -%type cast_expr unary_expr primary string STRING +%type cast_expr unary_expr primary STRING %type reserved_declspecs boolean.literal %type reserved_typespecquals %type SCSPEC TYPESPEC CV_QUALIFIER maybe_cv_qualifier @@ -543,9 +543,8 @@ extdef: { do_pending_inlines (); } | template_def { do_pending_inlines (); } - | asm_keyword '(' string ')' ';' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); - assemble_asm ($3); } + | asm_keyword '(' STRING ')' ';' + { assemble_asm ($3); } | extern_lang_string '{' extdefs_opt '}' { pop_lang_context (); } | extern_lang_string .hush_warning fndef .warning_ok eat_saved_input @@ -1608,10 +1607,10 @@ primary: } | CONSTANT | boolean.literal - | string + | STRING { - $$ = combine_strings ($$); - /* combine_strings doesn't set up TYPE_MAIN_VARIANT of + $$ = fix_string_type ($$); + /* fix_string_type doesn't set up TYPE_MAIN_VARIANT of a const array the way we want, so fix it. */ if (flag_const_strings) TREE_TYPE ($$) = build_cplus_array_type @@ -1812,13 +1811,6 @@ boolean.literal: { $$ = boolean_false_node; } ; -/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ -string: - STRING - | string STRING - { $$ = chainon ($$, $2); } - ; - nodecls: /* empty */ { @@ -2098,8 +2090,8 @@ nomods_initdecls: maybeasm: /* empty */ { $$ = NULL_TREE; } - | asm_keyword '(' string ')' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; } + | asm_keyword '(' STRING ')' + { $$ = $3; } ; initdcl: @@ -3494,27 +3486,27 @@ simple_stmt: { $$ = finish_return_stmt (NULL_TREE); } | RETURN_KEYWORD expr ';' { $$ = finish_return_stmt ($2); } - | asm_keyword maybe_cv_qualifier '(' string ')' ';' + | asm_keyword maybe_cv_qualifier '(' STRING ')' ';' { $$ = finish_asm_stmt ($2, $4, NULL_TREE, NULL_TREE, NULL_TREE); ASM_INPUT_P ($$) = 1; } /* This is the case with just output operands. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ')' ';' + | asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ')' ';' { $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); } /* This is the case with input operands as well. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':' + | asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ':' asm_operands ')' ';' { $$ = finish_asm_stmt ($2, $4, $6, $8, NULL_TREE); } - | asm_keyword maybe_cv_qualifier '(' string SCOPE asm_operands ')' ';' + | asm_keyword maybe_cv_qualifier '(' STRING SCOPE asm_operands ')' ';' { $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, NULL_TREE); } /* This is the case with clobbered registers as well. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':' + | asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' { $$ = finish_asm_stmt ($2, $4, $6, $8, $10); } - | asm_keyword maybe_cv_qualifier '(' string SCOPE asm_operands ':' + | asm_keyword maybe_cv_qualifier '(' STRING SCOPE asm_operands ':' asm_clobbers ')' ';' { $$ = finish_asm_stmt ($2, $4, NULL_TREE, $6, $8); } - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands SCOPE + | asm_keyword maybe_cv_qualifier '(' STRING ':' asm_operands SCOPE asm_clobbers ')' ';' { $$ = finish_asm_stmt ($2, $4, $6, NULL_TREE, $8); } | GOTO '*' expr ';' @@ -3677,10 +3669,10 @@ asm_operand: ; asm_clobbers: - string - { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE);} - | asm_clobbers ',' string - { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); } + STRING + { $$ = tree_cons (NULL_TREE, $1, NULL_TREE);} + | asm_clobbers ',' STRING + { $$ = tree_cons (NULL_TREE, $3, $1); } ; /* This is what appears inside the parens in a function declarator. diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 8c9b1c14f7f..16df801b0d0 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -259,7 +259,7 @@ tinfo_name (type) tree name_string; name = mangle_type_string (type); - name_string = combine_strings (build_string (strlen (name) + 1, name)); + name_string = fix_string_type (build_string (strlen (name) + 1, name)); return name_string; } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 0f53f6b1ece..ce1cbaca68a 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -863,9 +863,6 @@ finish_asm_stmt (cv_qualifier, string, output_operands, tree r; tree t; - if (TREE_CHAIN (string)) - string = combine_strings (string); - if (cv_qualifier != NULL_TREE && cv_qualifier != ridpointers[(int) RID_VOLATILE]) { diff --git a/gcc/cp/spew.c b/gcc/cp/spew.c index 212dada088c..9607e975f11 100644 --- a/gcc/cp/spew.c +++ b/gcc/cp/spew.c @@ -102,6 +102,7 @@ static SPEW_INLINE int identifier_type PARAMS ((tree)); static void scan_tokens PARAMS ((int)); static void feed_defarg PARAMS ((tree)); static void finish_defarg PARAMS ((void)); +static void yylexstring PARAMS ((struct token *)); static int read_token PARAMS ((struct token *)); static SPEW_INLINE int num_tokens PARAMS ((void)); @@ -242,6 +243,43 @@ read_process_identifier (pyylval) return IDENTIFIER; } +/* Concatenate strings before returning them to the parser. This isn't quite + as good as having it done in the lexer, but it's better than nothing. */ + +static void +yylexstring (t) + struct token *t; +{ + enum cpp_ttype next_type; + tree next; + + next_type = c_lex (&next); + if (next_type == CPP_STRING || next_type == CPP_WSTRING) + { + varray_type strings; + + VARRAY_TREE_INIT (strings, 32, "strings"); + VARRAY_PUSH_TREE (strings, t->yylval.ttype); + + do + { + VARRAY_PUSH_TREE (strings, next); + next_type = c_lex (&next); + } + while (next_type == CPP_STRING || next_type == CPP_WSTRING); + + t->yylval.ttype = combine_strings (strings); + last_token_id = t->yylval.ttype; + + VARRAY_FREE (strings); + } + + /* We will have always read one token too many. */ + _cpp_backup_tokens (parse_in, 1); + + t->yychar = STRING; +} + /* Read the next token from the input file. The token is written into T, and its type number is returned. */ static int @@ -336,7 +374,7 @@ read_token (t) case CPP_STRING: case CPP_WSTRING: - t->yychar = STRING; + yylexstring (t); break; default: -- cgit v1.2.1