OSDN Git Service

PR tree-optimization/9814
[pf3gnuchains/gcc-fork.git] / gcc / c-parser.c
index 9a5d669..d0eec8d 100644 (file)
@@ -239,9 +239,6 @@ c_parse_init (void)
 /* A keyword.  */
 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
 
-/* The number of token types, including C-specific ones.  */
-#define N_C_TTYPES ((int) (CPP_KEYWORD + 1))
-
 /* More information about the type of a CPP_NAME token.  */
 typedef enum c_id_kind {
   /* An ordinary identifier.  */
@@ -2148,7 +2145,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
      which is resolved in the direction of treating it as a typedef
      name.  If a close parenthesis follows, it is also an empty
      parameter list, as the syntax does not permit empty abstract
-     declarators.  Otherwise, it is a parenthesised declarator (in
+     declarators.  Otherwise, it is a parenthesized declarator (in
      which case the analysis may be repeated inside it, recursively).
 
      ??? There is an ambiguity in a parameter declaration "int
@@ -2158,7 +2155,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
      documenting.  At present we follow an accident of the old
      parser's implementation, whereby the first parameter must have
      some declaration specifiers other than just attributes.  Thus as
-     a parameter declaration it is treated as a parenthesised
+     a parameter declaration it is treated as a parenthesized
      parameter named x, and as an abstract declarator it is
      rejected.
 
@@ -3876,7 +3873,7 @@ c_parser_asm_statement (c_parser *parser)
   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
           || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
     {
-      warning ("%E qualifier ignored on asm",
+      warning (0, "%E qualifier ignored on asm",
               c_parser_peek_token (parser)->value);
       quals = NULL_TREE;
       c_parser_consume_token (parser);
@@ -4498,66 +4495,46 @@ c_parser_unary_expression (c_parser *parser)
 {
   int ext;
   struct c_expr ret;
-  ret.original_code = ERROR_MARK;
   switch (c_parser_peek_token (parser)->type)
     {
     case CPP_PLUS_PLUS:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (PREINCREMENT_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (PREINCREMENT_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_MINUS_MINUS:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (PREDECREMENT_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (PREDECREMENT_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_AND:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (ADDR_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (ADDR_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_MULT:
       c_parser_consume_token (parser);
       ret.value
        = build_indirect_ref (c_parser_cast_expression (parser, NULL).value,
                              "unary *");
+      ret.original_code = ERROR_MARK;
       return ret;
     case CPP_PLUS:
       c_parser_consume_token (parser);
-      if (!c_dialect_objc () && warn_traditional && !in_system_header)
-       warning ("traditional C rejects the unary plus operator");
-      ret.value
-       = build_unary_op (CONVERT_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      if (!c_dialect_objc () && !in_system_header)
+       warning (OPT_Wtraditional,
+                "traditional C rejects the unary plus operator");
+      return parser_build_unary_op (CONVERT_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_MINUS:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (NEGATE_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (NEGATE_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_COMPL:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (BIT_NOT_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (BIT_NOT_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_NOT:
       c_parser_consume_token (parser);
-      ret.value
-       = build_unary_op (TRUTH_NOT_EXPR,
-                         c_parser_cast_expression (parser, NULL).value, 0);
-      overflow_warning (ret.value);
-      return ret;
+      return parser_build_unary_op (TRUTH_NOT_EXPR,
+                                   c_parser_cast_expression (parser, NULL));
     case CPP_AND_AND:
       /* Refer to the address of a label as a pointer.  */
       c_parser_consume_token (parser);
@@ -4566,14 +4543,14 @@ c_parser_unary_expression (c_parser *parser)
          ret.value = finish_label_address_expr
            (c_parser_peek_token (parser)->value);
          c_parser_consume_token (parser);
-         return ret;
        }
       else
        {
          c_parser_error (parser, "expected identifier");
          ret.value = error_mark_node;
-         return ret;
        }
+       ret.original_code = ERROR_MARK;
+       return ret;
     case CPP_KEYWORD:
       switch (c_parser_peek_token (parser)->keyword)
        {
@@ -4589,18 +4566,14 @@ c_parser_unary_expression (c_parser *parser)
          return ret;
        case RID_REALPART:
          c_parser_consume_token (parser);
-         ret.value
-           = build_unary_op (REALPART_EXPR,
-                             c_parser_cast_expression (parser, NULL).value,
-                             0);
-         return ret;
+         return parser_build_unary_op (REALPART_EXPR,
+                                       c_parser_cast_expression (parser,
+                                                                 NULL));
        case RID_IMAGPART:
          c_parser_consume_token (parser);
-         ret.value
-           = build_unary_op (IMAGPART_EXPR,
-                             c_parser_cast_expression (parser, NULL).value,
-                             0);
-         return ret;
+         return parser_build_unary_op (IMAGPART_EXPR,
+                                       c_parser_cast_expression (parser,
+                                                                 NULL));
        default:
          return c_parser_postfix_expression (parser);
        }
@@ -5352,7 +5325,7 @@ c_parser_expr_list (c_parser *parser)
 
    "@interface identifier (" must start "@interface identifier (
    identifier ) ...": objc-methodprotolist in the first production may
-   not start with a parenthesised identifier as a declarator of a data
+   not start with a parenthesized identifier as a declarator of a data
    definition with no declaration specifiers if the objc-superclass,
    objc-protocol-refs and objc-class-instance-variables are omitted.  */
 
@@ -5793,6 +5766,8 @@ c_parser_objc_method_decl (c_parser *parser)
   tree type = NULL_TREE;
   tree sel;
   tree parms = NULL_TREE;
+  bool ellipsis = false;
+
   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
     {
       c_parser_consume_token (parser);
@@ -5807,7 +5782,6 @@ c_parser_objc_method_decl (c_parser *parser)
     {
       tree tsel = sel;
       tree list = NULL_TREE;
-      bool ellipsis;
       while (true)
        {
          tree atype = NULL_TREE, id, keyworddecl;
@@ -5837,7 +5811,6 @@ c_parser_objc_method_decl (c_parser *parser)
         method parameters follow the C syntax, and may include '...'
         to denote a variable number of arguments.  */
       parms = make_node (TREE_LIST);
-      ellipsis = false;
       while (c_parser_next_token_is (parser, CPP_COMMA))
        {
          struct c_parm *parm;
@@ -5854,10 +5827,9 @@ c_parser_objc_method_decl (c_parser *parser)
          parms = chainon (parms,
                           build_tree_list (NULL_TREE, grokparm (parm)));
        }
-      TREE_OVERFLOW (parms) = ellipsis;
       sel = list;
     }
-  return objc_build_method_signature (type, sel, parms);
+  return objc_build_method_signature (type, sel, parms, ellipsis);
 }
 
 /* Parse an objc-type-name.