OSDN Git Service

* c-lex.c (c_lex): Peek a token ahead for a string to concatenate,
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Dec 2001 12:01:59 +0000 (12:01 +0000)
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Dec 2001 12:01:59 +0000 (12:01 +0000)
using combine_strings to do the concatenation.
* c-parse.in: Replace uses of the string non-terminal with STRING.
Don't attempt string concatenation.
(OBJC_STRING): New terminal.
(string): Remove non-terminal.
(_yylex): Call combine_strings on function names.  Generate
OBJC_STRING terminals; don't pass '@' on to yacc.
* c-typeck.c (simple_asm_stmt): Don't concatenate strings here.
(build_asm_stmt): Similarly.
cp:
* parse.y: Replace uses of the string non-terminal with STRING.
Don't perform string concatentaion here.
(string): Remove non-terminal.
* semantics.c (finish_asm_stmt): Don't concatenate strings here.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47792 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-lex.c
gcc/c-parse.in
gcc/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/parse.y
gcc/cp/semantics.c

index 5883912..6d7d6b6 100644 (file)
@@ -1,3 +1,16 @@
+2001-12-08  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * c-lex.c (c_lex): Peek a token ahead for a string to concatenate,
+       using combine_strings to do the concatenation.
+       * c-parse.in: Replace uses of the string non-terminal with STRING.
+       Don't attempt string concatenation.
+       (OBJC_STRING): New terminal.
+       (string): Remove non-terminal.
+       (_yylex): Call combine_strings on function names.  Generate
+       OBJC_STRING terminals; don't pass '@' on to yacc.
+       * c-typeck.c (simple_asm_stmt): Don't concatenate strings here.
+       (build_asm_stmt): Similarly.
+
 2001-12-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * rtlanal.c (get_jump_table_offset): Delete unused variable.
index e70be70..84d64f1 100644 (file)
@@ -762,6 +762,7 @@ c_lex (value)
      tree *value;
 {
   const cpp_token *tok;
+  enum cpp_ttype result;
 
   retry:
   timevar_push (TV_CPP);
@@ -776,7 +777,9 @@ c_lex (value)
   lineno = src_lineno;
 
   *value = NULL_TREE;
-  switch (tok->type)
+  result = tok->type;
+
+  switch (result)
     {
     case CPP_OPEN_BRACE:  indent_level++;  break;
     case CPP_CLOSE_BRACE: indent_level--;  break;
@@ -804,8 +807,48 @@ c_lex (value)
 
     case CPP_STRING:
     case CPP_WSTRING:
-      *value = lex_string ((const char *)tok->val.str.text,
-                          tok->val.str.len, tok->type == CPP_WSTRING);
+      {
+       tree full_str = NULL_TREE;
+
+       do
+         {
+           /* Translate escape sequences in this string, then append it.  */
+           tree str = lex_string ((const char *) tok->val.str.text,
+                                  tok->val.str.len,
+                                  tok->type == CPP_WSTRING);
+
+           if (full_str && c_language == clk_c && warn_traditional
+               && !in_system_header)
+             {
+               static int last_lineno;
+               static const char *last_input_filename;
+
+               if (lineno != last_lineno || !last_input_filename
+                   || strcmp (last_input_filename, input_filename))
+                 {
+                   warning ("traditional C rejects string concatenation");
+                   last_lineno = lineno;
+                   last_input_filename = input_filename;
+                 }
+             }
+
+           full_str = chainon (full_str, str);
+
+           /* Wide and non-wide give a wide result.  */
+           if (tok->type == CPP_WSTRING)
+             result = CPP_WSTRING;
+
+           /* Look ahead for another string token.  */
+           do
+             tok = cpp_get_token (parse_in);
+           while (tok->type == CPP_PADDING);
+         }
+       while (tok->type == CPP_STRING || tok->type == CPP_WSTRING);
+
+       _cpp_backup_tokens (parse_in, 1);
+
+       *value = combine_strings (full_str);
+      }
       break;
 
       /* These tokens should not be visible outside cpplib.  */
@@ -817,7 +860,7 @@ c_lex (value)
     default: break;
     }
 
-  return tok->type;
+  return result;
 }
 
 #define ERROR(msgid) do { error(msgid); goto syntax_error; } while(0)
index e0457b2..fadef4e 100644 (file)
@@ -99,9 +99,8 @@ end ifobjc
    yylval is the node for the constant.  */
 %token CONSTANT
 
-/* String constants in raw form.
-   yylval is a STRING_CST node.  */
-%token STRING
+/* String constants as arrays of the appropriate character type.  */
+%token STRING OBJC_STRING
 
 /* "...", used for functions with variable arglists.  */
 %token ELLIPSIS
@@ -151,7 +150,7 @@ end ifobjc
 %type <ttype> BREAK CONTINUE RETURN GOTO ASM_KEYWORD SIZEOF TYPEOF ALIGNOF
 
 %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist
-%type <ttype> expr_no_commas cast_expr unary_expr primary string STRING
+%type <ttype> expr_no_commas cast_expr unary_expr primary STRING
 %type <ttype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea
 %type <ttype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea
 %type <ttype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea
@@ -204,6 +203,8 @@ end ifobjc
 %type <lineno> save_lineno
 \f
 ifobjc
+%token OBJC_STRING
+
 /* the Objective-C nonterminals */
 
 %type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator
@@ -214,7 +215,7 @@ ifobjc
 %type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr
 %type <ttype> objc_string non_empty_protocolrefs protocolrefs identifier_list objcprotocolexpr
 
-%type <ttype> CLASSNAME OBJECTNAME
+%type <ttype> CLASSNAME OBJECTNAME OBJC_STRING
 end ifobjc
 \f
 %{
@@ -618,8 +619,8 @@ primary:
                  $$ = build_external_ref ($1, yychar == '(');
                }
        | CONSTANT
-       | string
-               { $$ = combine_strings ($1); }
+       | STRING
+               { $$ = $1; }
        | VAR_FUNC_NAME
                { $$ = fname_decl (C_RID_CODE ($$), $$); }
        | '(' typename ')' '{' 
@@ -709,37 +710,13 @@ ifobjc
 end ifobjc
        ;
 
-/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it.  */
-string:
-         STRING
-       | string STRING
-               {
-ifc
-                  static int last_lineno = 0;
-                  static const char *last_input_filename = 0;
-end ifc
-                  $$ = chainon ($1, $2);
-ifc
-                 if (warn_traditional && !in_system_header
-                     && (lineno != last_lineno || !last_input_filename ||
-                         strcmp (last_input_filename, input_filename)))
-                   {
-                     warning ("traditional C rejects string concatenation");
-                     last_lineno = lineno;
-                     last_input_filename = input_filename;
-                   }
-end ifc
-               }
-       ;
-
 ifobjc
-/* Produces an STRING_CST with perhaps more STRING_CSTs chained
-   onto it, which is to be read as an ObjC string object.  */
+/* Chains ObjC string objects together.  */
 objc_string:
-         '@' STRING
-               { $$ = $2; }
-       | objc_string '@' STRING
-               { $$ = chainon ($1, $3); }
+         OBJC_STRING
+               { $$ = $1; }
+       | objc_string OBJC_STRING
+               { $$ = chainon ($1, $2); }
        ;
 end ifobjc
 
@@ -1372,10 +1349,8 @@ notype_initdecls:
 maybeasm:
          /* empty */
                { $$ = NULL_TREE; }
-       | ASM_KEYWORD '(' string ')'
-               { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
-                 $$ = $3;
-               }
+       | ASM_KEYWORD '(' STRING ')'
+               { $$ = $3; }
        ;
 
 initdcl:
@@ -2433,10 +2408,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); }
        ;
 \f
 /* This is what appears inside the parens in a function declarator.
@@ -3578,7 +3553,8 @@ end ifobjc
               to string constants.  */
            const char *name = fname_string (rid_code);
          
-           yylval.ttype = build_string (strlen (name) + 1, name);
+           yylval.ttype
+             = combine_strings (build_string (strlen (name) + 1, name));
            last_token = CPP_STRING;  /* so yyerror won't choke */
            return STRING;
          }
@@ -3695,23 +3671,16 @@ _yylex ()
         special significance.  */
     case CPP_ATSIGN:
 ifobjc
-      {
-       tree after_at;
-       enum cpp_ttype after_at_type;
+       last_token = c_lex (&yylval.ttype);
 
-       after_at_type = c_lex (&after_at);
+       if (last_token == CPP_NAME
+           && C_IS_RESERVED_WORD (yylval.ttype)
+           && OBJC_IS_AT_KEYWORD (C_RID_CODE (yylval.ttype)))
+         return rid_to_yy [(int) C_RID_CODE (yylval.ttype)];
+       else if (last_token == CPP_STRING || last_token == CPP_WSTRING)
+         return OBJC_STRING;
 
-       if (after_at_type == CPP_NAME
-           && C_IS_RESERVED_WORD (after_at)
-           && OBJC_IS_AT_KEYWORD (C_RID_CODE (after_at)))
-         {
-           yylval.ttype = after_at;
-           last_token = after_at_type;
-           return rid_to_yy [(int) C_RID_CODE (after_at)];
-         }
-       _cpp_backup_tokens (parse_in, 1);
-       return '@';
-      }
+       /* Fall through...  */
 end ifobjc
 
       /* These tokens are C++ specific (and will not be generated
index 5677504..df7606e 100644 (file)
@@ -6832,8 +6832,6 @@ simple_asm_stmt (expr)
     {
       tree stmt;
 
-      if (TREE_CHAIN (expr))
-       expr = combine_strings (expr);
       stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, expr,
                                   NULL_TREE, NULL_TREE,
                                   NULL_TREE));
@@ -6858,8 +6856,6 @@ build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers)
 {
   tree tail;
 
-  if (TREE_CHAIN (string))
-    string = combine_strings (string);
   if (TREE_CODE (string) != STRING_CST)
     {
       error ("asm template is not a string constant");
index 443f07f..8329fb3 100644 (file)
@@ -1,3 +1,10 @@
+2001-12-08  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * parse.y: Replace uses of the string non-terminal with STRING.
+       Don't perform string concatentaion here.
+       (string): Remove non-terminal.
+       * semantics.c (finish_asm_stmt): Don't concatenate strings here.
+
 2001-12-05  Jason Merrill  <jason@redhat.com>
 
        * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Define.
index a27f288..e5bedd3 100644 (file)
@@ -259,8 +259,7 @@ cp_parse_init ()
    yylval contains an IDENTIFIER_NODE which indicates which one.  */
 %token VAR_FUNC_NAME
 
-/* String constants in raw form.
-   yylval is a STRING_CST node.  */
+/* String constants as arrays of a suitable type.  */
 %token STRING
 
 /* "...", used for functions with variable arglists.  */
@@ -329,7 +328,7 @@ cp_parse_init ()
 %type <ttype> PFUNCNAME maybe_identifier
 %type <ttype> paren_expr_or_null nontrivial_exprlist SELFNAME
 %type <ttype> expr_no_commas expr_no_comma_rangle
-%type <ttype> cast_expr unary_expr primary string STRING
+%type <ttype> cast_expr unary_expr primary STRING
 %type <ttype> reserved_declspecs boolean.literal
 %type <ttype> reserved_typespecquals
 %type <ttype> SCSPEC TYPESPEC CV_QUALIFIER maybe_cv_qualifier
@@ -497,9 +496,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
@@ -1547,9 +1545,8 @@ primary:
                }               
        | CONSTANT
        | boolean.literal
-       | string
+       | STRING
                {
-                 $$ = combine_strings ($$);
                  /* combine_strings doesn't set up TYPE_MAIN_VARIANT of
                     a const array the way we want, so fix it.  */
                  if (flag_const_strings)
@@ -1751,13 +1748,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 */
                {
@@ -2041,8 +2031,8 @@ nomods_initdecls:
 maybeasm:
          /* empty */
                { $$ = NULL_TREE; }
-       | asm_keyword '(' string ')'
-               { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; }
+       | asm_keyword '(' STRING ')'
+               { $$ = $3; }
        ;
 
 initdcl:
@@ -3439,27 +3429,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 ';'
@@ -3614,10 +3604,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.
index 2a31da0..75cfa69 100644 (file)
@@ -883,9 +883,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])
     {