OSDN Git Service

* ifcvt.c: New file.
[pf3gnuchains/gcc-fork.git] / gcc / c-parse.in
index 80ed5c3..deea8e9 100644 (file)
@@ -1,5 +1,6 @@
 /* YACC parser for C syntax and for Objective C.  -*-c-*-
-   Copyright (C) 1987, 88, 89, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -114,6 +115,7 @@ end ifc
 %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF
 %token ATTRIBUTE EXTENSION LABEL
 %token REALPART IMAGPART VA_ARG
+%token PTR_VALUE PTR_BASE PTR_EXTENT
 
 /* Used in c-lex.c for parsing pragmas.  */
 %token END_OF_LINE
@@ -230,10 +232,10 @@ static int undeclared_variable_notice;
 /* For __extension__, save/restore the warning flags which are
    controlled by __extension__.  */
 #define SAVE_WARN_FLAGS()      \
-       build_int_2 (pedantic | (warn_pointer_arith << 1), 0)
+       size_int (pedantic | (warn_pointer_arith << 1))
 #define RESTORE_WARN_FLAGS(tval) \
   do {                                     \
-    int val = TREE_INT_CST_LOW (tval);     \
+    int val = tree_low_cst (tval, 0);      \
     pedantic = val & 1;                    \
     warn_pointer_arith = (val >> 1) & 1;   \
   } while (0)
@@ -264,6 +266,13 @@ c_parse_init ()
   ggc_add_tree_root (&declspec_stack, 1);
   ggc_add_tree_root (&current_declspecs, 1);
   ggc_add_tree_root (&prefix_attributes, 1);
+ifobjc
+  ggc_add_tree_root (&objc_interface_context, 1);
+  ggc_add_tree_root (&objc_implementation_context, 1);
+  ggc_add_tree_root (&objc_method_context, 1);
+  ggc_add_tree_root (&objc_ivar_chain, 1);
+  ggc_add_tree_root (&objc_ivar_context, 1);
+end ifobjc
 }
 
 %}
@@ -320,18 +329,15 @@ datadef:
 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($1); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
         | declmods setspecs notype_initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs setspecs initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2);  }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
         | declmods ';'
          { pedwarn ("empty declaration"); }
        | typed_declspecs ';'
@@ -346,7 +352,7 @@ datadef:
 fndef:
          typed_declspecs setspecs declarator
                { if (! start_function (current_declspecs, $3,
-                                       prefix_attributes, NULL_TREE, 0))
+                                       prefix_attributes, NULL_TREE))
                    YYERROR1;
                  reinit_parse_for_function (); }
          old_style_parm_decls
@@ -355,16 +361,14 @@ fndef:
                { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs setspecs declarator error
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods setspecs notype_declarator
                { if (! start_function (current_declspecs, $3,
-                                       prefix_attributes, NULL_TREE, 0))
+                                       prefix_attributes, NULL_TREE))
                    YYERROR1;
                  reinit_parse_for_function (); }
          old_style_parm_decls
@@ -373,16 +377,14 @@ fndef:
                { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods setspecs notype_declarator error
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | setspecs notype_declarator
                { if (! start_function (NULL_TREE, $2,
-                                       prefix_attributes, NULL_TREE, 0))
+                                       prefix_attributes, NULL_TREE))
                    YYERROR1;
                  reinit_parse_for_function (); }
          old_style_parm_decls
@@ -391,13 +393,11 @@ fndef:
                { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($1); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | setspecs notype_declarator error
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($1); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        ;
 
 identifier:
@@ -528,7 +528,7 @@ cast_expr:
                  tree type = $2;
                  finish_init ();
 
-                 if (pedantic && ! flag_isoc9x)
+                 if (pedantic && ! flag_isoc99)
                    pedwarn ("ANSI C forbids constructor expressions");
                  if (TYPE_NAME (type) != 0)
                    {
@@ -540,7 +540,7 @@ cast_expr:
                  else
                    name = "";
                  $$ = result;
-                 if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
+                 if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
                    {
                      int failure = complete_array_type (type, $$, 1);
                      if (failure)
@@ -943,13 +943,11 @@ datadecl:
        typed_declspecs_no_prefix_attr setspecs initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods_no_prefix_attr setspecs notype_initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);      
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs_no_prefix_attr ';'
                { shadow_tag_warned ($1, 1);
                  pedwarn ("empty declaration"); }
@@ -978,8 +976,7 @@ decls:
    Maintains a stack of outer-level values of current_declspecs,
    for the sake of parm declarations nested in function declarators.  */
 setspecs: /* empty */
-               { $$ = suspend_momentary ();
-                 pending_xref_error ();
+               { pending_xref_error ();
                  declspec_stack = tree_cons (prefix_attributes,
                                              current_declspecs,
                                              declspec_stack);
@@ -996,23 +993,19 @@ decl:
        typed_declspecs setspecs initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods setspecs notype_initdecls ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs setspecs nested_function
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods setspecs notype_nested_function
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs ';'
                { shadow_tag ($1); }
        | declmods ';'
@@ -1256,18 +1249,9 @@ any_word:
 init:
        expr_no_commas
        | '{'
-               { really_start_incremental_init (NULL_TREE);
-                 /* Note that the call to clear_momentary
-                    is in process_init_element.  */
-                 push_momentary (); }
+               { really_start_incremental_init (NULL_TREE); }
          initlist_maybe_comma '}'
-               { $$ = pop_init_level (0);
-                 if ($$ == error_mark_node
-                     && ! (yychar == STRING || yychar == CONSTANT))
-                   pop_momentary ();
-                 else
-                   pop_momentary_nofree (); }
-
+               { $$ = pop_init_level (0); }
        | error
                { $$ = error_mark_node; }
        ;
@@ -1332,7 +1316,7 @@ nested_function:
 
                  push_function_context ();
                  if (! start_function (current_declspecs, $1,
-                                       prefix_attributes, NULL_TREE, 1))
+                                       prefix_attributes, NULL_TREE))
                    {
                      pop_function_context ();
                      YYERROR1;
@@ -1358,7 +1342,7 @@ notype_nested_function:
 
                  push_function_context ();
                  if (! start_function (current_declspecs, $1,
-                                       prefix_attributes, NULL_TREE, 1))
+                                       prefix_attributes, NULL_TREE))
                    {
                      pop_function_context ();
                      YYERROR1;
@@ -1428,8 +1412,8 @@ parm_declarator:
 ifc
        | parm_declarator '[' '*' ']'  %prec '.'
                { $$ = build_nt (ARRAY_REF, $1, NULL_TREE);
-                 if (! flag_isoc9x)
-                   error ("`[*]' in parameter declaration only allowed in ISO C 9x");
+                 if (! flag_isoc99)
+                   error ("`[*]' in parameter declaration only allowed in ISO C 99");
                }
 end ifc
        | parm_declarator '[' expr ']'  %prec '.'
@@ -1464,8 +1448,8 @@ notype_declarator:
 ifc
        | notype_declarator '[' '*' ']'  %prec '.'
                { $$ = build_nt (ARRAY_REF, $1, NULL_TREE);
-                 if (! flag_isoc9x)
-                   error ("`[*]' in parameter declaration only allowed in ISO C 9x");
+                 if (! flag_isoc99)
+                   error ("`[*]' in parameter declaration only allowed in ISO C 99");
                }
 end ifc
        | notype_declarator '[' expr ']'  %prec '.'
@@ -1527,17 +1511,15 @@ structsp:
        | union_head identifier
                { $$ = xref_tag (UNION_TYPE, $2); }
        | enum_head identifier '{'
-               { $<itype>3 = suspend_momentary ();
-                 $$ = start_enum ($2); }
+               { $$ = start_enum ($2); }
          enumlist maybecomma_warn '}' maybe_attribute
-               { $$= finish_enum ($<ttype>4, nreverse ($5), chainon ($1, $8));
-                 resume_momentary ($<itype>3); }
+               { $$ = finish_enum ($<ttype>4, nreverse ($5),
+                                   chainon ($1, $8)); }
        | enum_head '{'
-               { $<itype>2 = suspend_momentary ();
-                 $$ = start_enum (NULL_TREE); }
+               { $$ = start_enum (NULL_TREE); }
          enumlist maybecomma_warn '}' maybe_attribute
-               { $$= finish_enum ($<ttype>3, nreverse ($4), chainon ($1, $7));
-                 resume_momentary ($<itype>2); }
+               { $$ = finish_enum ($<ttype>3, nreverse ($4),
+                                   chainon ($1, $7)); }
        | enum_head identifier
                { $$ = xref_tag (ENUMERAL_TYPE, $2); }
        ;
@@ -1550,7 +1532,7 @@ maybecomma:
 maybecomma_warn:
          /* empty */
        | ','
-               { if (pedantic && ! flag_isoc9x)
+               { if (pedantic && ! flag_isoc99)
                    pedwarn ("comma at end of enumerator list"); }
        ;
 
@@ -1601,8 +1583,7 @@ component_decl:
                { $$ = $3;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_typespecs setspecs save_filename save_lineno maybe_attribute
                {
                  /* Support for unnamed structs or unions as members of 
@@ -1615,14 +1596,12 @@ component_decl:
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2);
                }
     | nonempty_type_quals setspecs components
                { $$ = $3;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | nonempty_type_quals
                { if (pedantic)
                    pedwarn ("ANSI C forbids member declarations with no members");
@@ -1763,7 +1742,6 @@ pushlevel:  /* empty */
                { emit_line_note (input_filename, lineno);
                  pushlevel (0);
                  clear_last_expr ();
-                 push_momentary ();
                  expand_start_bindings (0);
 ifobjc
                  if (objc_method_context)
@@ -1813,27 +1791,15 @@ compstmt_nostart: '}'
        | pushlevel maybe_label_decls decls xstmts '}'
                { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), 1, 0);
-                 $$ = poplevel (1, 1, 0);
-                 if (yychar == CONSTANT || yychar == STRING)
-                   pop_momentary_nofree ();
-                 else
-                   pop_momentary (); }
+                 $$ = poplevel (1, 1, 0); }
        | pushlevel maybe_label_decls error '}'
                { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), kept_level_p (), 0);
-                 $$ = poplevel (kept_level_p (), 0, 0);
-                 if (yychar == CONSTANT || yychar == STRING)
-                   pop_momentary_nofree ();
-                 else
-                   pop_momentary (); }
+                 $$ = poplevel (kept_level_p (), 0, 0); }
        | pushlevel maybe_label_decls stmts '}'
                { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), kept_level_p (), 0);
-                 $$ = poplevel (kept_level_p (), 0, 0);
-                 if (yychar == CONSTANT || yychar == STRING)
-                   pop_momentary_nofree ();
-                 else
-                   pop_momentary (); }
+                 $$ = poplevel (kept_level_p (), 0, 0); }
        ;
 
 compstmt_primary_start:
@@ -1944,8 +1910,7 @@ stmt:
                      || TREE_CODE (TREE_TYPE ($1)) == FUNCTION_TYPE)
                    $1 = default_conversion ($1);
 #endif
-                 iterator_expand ($1);
-                 clear_momentary (); }
+                 iterator_expand ($1); }
        | simple_if ELSE
                { c_expand_start_else ();
                  $<itype>1 = stmt_count;
@@ -1994,12 +1959,10 @@ stmt:
                { emit_line_note (input_filename, lineno);
                  expand_exit_loop_if_false (NULL_PTR,
                                             truthvalue_conversion ($3));
-                 expand_end_loop ();
-                 clear_momentary (); }
+                 expand_end_loop (); }
 /* This rule is needed to make sure we end every loop we start.  */
        | do_stmt_start error
-               { expand_end_loop ();
-                 clear_momentary (); }
+               { expand_end_loop (); }
        | FOR
          '(' xexpr ';'
                { stmt_count++;
@@ -2026,9 +1989,6 @@ stmt:
                  if ($6)
                    expand_exit_loop_if_false (NULL_PTR,
                                               truthvalue_conversion ($6));
-                 /* Don't let the tree nodes for $9 be discarded by
-                    clear_momentary during the parsing of the next stmt.  */
-                 push_momentary ();
                  $<lineno>7 = lineno;
                  $<filename>8 = input_filename;
                  position_after_white_space (); }
@@ -2038,25 +1998,14 @@ stmt:
                  expand_loop_continue_here ();
                  if ($9)
                    c_expand_expr_stmt ($9);
-                 if (yychar == CONSTANT || yychar == STRING)
-                   pop_momentary_nofree ();
-                 else
-                   pop_momentary ();
                  expand_end_loop (); }
        | SWITCH '(' expr ')'
                { stmt_count++;
                  emit_line_note ($<filename>-1, $<lineno>0);
                  c_expand_start_case ($3);
-                 /* Don't let the tree nodes for $3 be discarded by
-                    clear_momentary during the parsing of the next stmt.  */
-                 push_momentary ();
                  position_after_white_space (); }
          lineno_labeled_stmt
-               { expand_end_case ($3);
-                 if (yychar == CONSTANT || yychar == STRING)
-                   pop_momentary_nofree ();
-                 else
-                   pop_momentary (); }
+               { expand_end_case ($3); }
        | BREAK ';'
                { stmt_count++;
                  emit_line_note ($<filename>-1, $<lineno>0);
@@ -2178,10 +2127,6 @@ all_iter_stmt_with_decl:
            emit_line_note (input_filename, lineno);
            expand_end_bindings (getdecls (), 1, 0);
            $<ttype>$ = poplevel (1, 1, 0);
-           if (yychar == CONSTANT || yychar == STRING)
-             pop_momentary_nofree ();
-           else
-             pop_momentary ();     
          }
 */
 
@@ -2384,8 +2329,7 @@ parm:
                                                         $4));
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs setspecs notype_declarator maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
                                                         $3),
@@ -2393,8 +2337,7 @@ parm:
                                                         $4)); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs setspecs absdcl maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
                                                         $3),
@@ -2402,8 +2345,7 @@ parm:
                                                         $4));
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | declmods setspecs notype_declarator maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
                                                         $3),
@@ -2411,8 +2353,7 @@ parm:
                                                         $4));
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2);  }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
 
        | declmods setspecs absdcl maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
@@ -2421,8 +2362,7 @@ parm:
                                                         $4));
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2);  }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        ;
 
 /* This is used in a function definition
@@ -2708,14 +2648,12 @@ ivar_decl:
                { $$ = $3;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | nonempty_type_quals setspecs ivars
                { $$ = $3;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | error
                { $$ = NULL_TREE; }
        ;
@@ -2902,8 +2840,7 @@ mydecl:
        typed_declspecs setspecs myparms ';'
                { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
-                 declspec_stack = TREE_CHAIN (declspec_stack);
-                 resume_momentary ($2); }
+                 declspec_stack = TREE_CHAIN (declspec_stack); }
        | typed_declspecs ';'
                { shadow_tag ($1); }
        | declmods ';'
@@ -2946,7 +2883,7 @@ optparmlist:
        | ',' ELLIPSIS
                {
                  /* oh what a kludge! */
-                 $$ = (tree)1;
+                 $$ = objc_ellipsis_node;
                }
        | ','
                {