OSDN Git Service

* c-decl.c (pushdecl_function_level): Make static, return nothing.
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jul 2003 03:39:42 +0000 (03:39 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jul 2003 03:39:42 +0000 (03:39 +0000)
(kept_level_p): Fold into poplevel.
(undeclared_variable): Moved here from c-typeck.c.  Export.
* c-tree.h (KEEP_YES, KEEP_NO, KEEP_MAYBE): New #defines.
(undeclared_variable): Prototype here.  Don't prototype
kept_level_p nor pushdecl_function_level.
* c-parse.in: Change first argument to poplevel from
"kept_level_p()" to "KEEP_MAYBE".
* c-typeck.c (undeclared_variable): Moved to c-decl.c.

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

gcc/ChangeLog
gcc/c-decl.c
gcc/c-parse.in
gcc/c-tree.h
gcc/c-typeck.c

index 514dfc5..890dfda 100644 (file)
@@ -1,3 +1,15 @@
+2003-07-17  Zack Weinberg  <zack@codesourcery.com>
+
+       * c-decl.c (pushdecl_function_level): Make static, return nothing.
+       (kept_level_p): Fold into poplevel.
+       (undeclared_variable): Moved here from c-typeck.c.  Export.
+       * c-tree.h (KEEP_YES, KEEP_NO, KEEP_MAYBE): New #defines.
+       (undeclared_variable): Prototype here.  Don't prototype
+       kept_level_p nor pushdecl_function_level.
+       * c-parse.in: Change first argument to poplevel from
+       "kept_level_p()" to "KEEP_MAYBE".
+       * c-typeck.c (undeclared_variable): Moved to c-decl.c.
+
 2003-07-17  Roger Sayle  <roger@eyesopen.com>
 
        * simplify-rtx.c (simplify_rtx): Use simplify_gen_binary to swap
index 9647a9e..07d8734 100644 (file)
@@ -291,6 +291,7 @@ static tree any_external_decl (tree);
 static void record_external_decl (tree);
 static void warn_if_shadowing (tree, tree);
 static void clone_underlying_type (tree);
+static void pushdecl_function_level (tree, tree);
 static bool flexible_array_type_p (tree);
 static hashval_t link_hash_hash        (const void *);
 static int link_hash_eq (const void *, const void *);
@@ -391,18 +392,6 @@ keep_next_level (void)
   keep_next_level_flag = 1;
 }
 
-/* Nonzero if the current level needs to have a BLOCK made.  */
-
-int
-kept_level_p (void)
-{
-  return ((current_binding_level->keep_if_subblocks
-          && current_binding_level->blocks != 0)
-         || current_binding_level->keep
-         || current_binding_level->names != 0
-         || current_binding_level->tags != 0);
-}
-
 /* Identify this binding level as a level of parameters.  */
 
 void
@@ -485,8 +474,12 @@ poplevel (int keep, int reverse, int functionbody)
   tree subblocks = current_binding_level->blocks;
 
   functionbody |= current_binding_level->function_body;
+
+  if (keep == KEEP_MAYBE)
+    keep = (current_binding_level->names || current_binding_level->tags);
+  
   keep |= (current_binding_level->keep || functionbody
-          || (current_binding_level->keep_if_subblocks && subblocks != 0));
+          || (subblocks && current_binding_level->keep_if_subblocks));
 
   /* We used to warn about unused variables in expand_end_bindings,
      i.e. while generating RTL.  But in function-at-a-time mode we may
@@ -1830,12 +1823,12 @@ pushdecl_top_level (tree x)
 
 /* Record X as belonging to the outermost scope of the current
    function.  This is used only internally, by c_make_fname_decl and
-   build_external_ref, and is limited to their needs.  The NAME is
-   provided as a separate argument because build_external_ref wants to
+   undeclared_variable, and is limited to their needs.  The NAME is
+   provided as a separate argument because undeclared_variable wants to
    use error_mark_node for X.  For VAR_DECLs, duplicate_decls is not
    called; if there is any preexisting decl for this identifier, it is
    an ICE.  */
-tree
+static void
 pushdecl_function_level (tree x, tree name)
 {
   struct binding_level *scope;
@@ -1862,7 +1855,6 @@ pushdecl_function_level (tree x, tree name)
     }
 
   IDENTIFIER_SYMBOL_VALUE (name) = x;
-  return x;
 }
 \f
 /* Generate an implicit declaration for identifier FUNCTIONID as a
@@ -1992,6 +1984,38 @@ redeclaration_error_message (tree newdecl, tree olddecl)
       return 0;
     }
 }
+
+/* Issue an error message for a reference to an undeclared variable
+   ID, including a reference to a builtin outside of function-call
+   context.  Establish a binding of the identifier to error_mark_node
+   in an appropriate scope, which will suppress further errors for the
+   same identifier.  */
+void
+undeclared_variable (tree id)
+{
+  static bool already = false;
+
+  if (current_function_decl == 0)
+    {
+      error ("`%s' undeclared here (not in a function)",
+            IDENTIFIER_POINTER (id));
+      IDENTIFIER_SYMBOL_VALUE (id) = error_mark_node;
+    }
+  else
+    {
+      error ("`%s' undeclared (first use in this function)",
+            IDENTIFIER_POINTER (id));
+
+      if (! already)
+       {
+         error ("(Each undeclared identifier is reported only once");
+         error ("for each function it appears in.)");
+         already = true;
+       }
+
+      pushdecl_function_level (error_mark_node, id);
+    }
+}
 \f
 /* Get the LABEL_DECL corresponding to identifier ID as a label.
    Create one if none exists so far for the current function.
index 1764558..8ec1fa7 100644 (file)
@@ -2087,7 +2087,7 @@ c99_block_end: /* empty */
                 { if (flag_isoc99)
                    {
                      tree scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
-                     $$ = poplevel (kept_level_p (), 0, 0);
+                     $$ = poplevel (KEEP_MAYBE, 0, 0);
                      SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt))
                        = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt))
                        = $$;
@@ -2137,7 +2137,7 @@ compstmt_start: '{' { compstmt_count++;
 compstmt_nostart: '}'
                { $$ = convert (void_type_node, integer_zero_node); }
        | pushlevel maybe_label_decls compstmt_contents_nonempty '}' poplevel
-               { $$ = poplevel (kept_level_p (), 1, 0);
+               { $$ = poplevel (KEEP_MAYBE, 1, 0);
                  SCOPE_STMT_BLOCK (TREE_PURPOSE ($5))
                    = SCOPE_STMT_BLOCK (TREE_VALUE ($5))
                    = $$; }
index ca071a9..876f116 100644 (file)
@@ -155,6 +155,11 @@ struct lang_type GTY(())
    without prototypes.  */
 #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_BINFO (NODE)
 
+/* Values for the first parameter to poplevel.  */
+#define KEEP_NO                0
+#define KEEP_YES       1
+#define KEEP_MAYBE     2
+
 \f
 /* in c-lang.c and objc-act.c */
 extern tree lookup_interface (tree);
@@ -175,7 +180,6 @@ extern void gen_aux_info_record (tree, int, int, int);
 
 /* in c-decl.c */
 extern int global_bindings_p (void);
-extern int kept_level_p (void);
 extern tree getdecls (void);
 extern void pushlevel (int);
 extern void insert_block (tree);
@@ -192,6 +196,7 @@ extern void check_for_loop_decls (void);
 extern void clear_parm_order (void);
 extern int  complete_array_type (tree, tree, int);
 extern void declare_parm_level (void);
+extern void undeclared_variable (tree);
 extern tree define_label (location_t, tree);
 extern void finish_decl (tree, tree, tree);
 extern tree finish_enum (tree, tree, tree);
@@ -213,7 +218,6 @@ extern void pop_label_level (void);
 extern void push_label_level (void);
 extern void push_parm_decl (tree);
 extern tree pushdecl_top_level (tree);
-extern tree pushdecl_function_level (tree, tree);
 extern void pushtag (tree, tree);
 extern tree set_array_declarator_type (tree, tree, int);
 extern tree shadow_label (tree);
index c4154de..a0ec52f 100644 (file)
@@ -49,9 +49,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    message within this initializer.  */
 static int missing_braces_mentioned;
 
-/* 1 if we explained undeclared var errors.  */
-static int undeclared_variable_notice;
-
 static tree qualify_type (tree, tree);
 static int tagged_types_tu_compatible_p (tree, tree, int);
 static int comp_target_types (tree, tree, int);
@@ -60,7 +57,6 @@ static int type_lists_compatible_p (tree, tree, int);
 static tree decl_constant_value_for_broken_optimization (tree);
 static tree default_function_array_conversion (tree);
 static tree lookup_field (tree, tree);
-static void undeclared_variable (tree);
 static tree convert_arguments (tree, tree, tree, tree);
 static tree pointer_diff (tree, tree);
 static tree unary_complex_lvalue (enum tree_code, tree, int);
@@ -1531,37 +1527,6 @@ build_array_ref (tree array, tree index)
   }
 }
 \f
-/* Issue an error message for a reference to an undeclared variable ID,
-   including a reference to a builtin outside of function-call context.
-   Arrange to suppress further errors for the same identifier.  */
-static void
-undeclared_variable (tree id)
-{
-  if (current_function_decl == 0)
-    {
-      error ("`%s' undeclared here (not in a function)",
-            IDENTIFIER_POINTER (id));
-      IDENTIFIER_SYMBOL_VALUE (id) = error_mark_node;
-    }
-  else
-    {
-      error ("`%s' undeclared (first use in this function)",
-            IDENTIFIER_POINTER (id));
-
-      if (! undeclared_variable_notice)
-       {
-         error ("(Each undeclared identifier is reported only once");
-         error ("for each function it appears in.)");
-         undeclared_variable_notice = 1;
-       }
-
-      /* Set IDENTIFIER_SYMBOL_VALUE (id) to error_mark_node
-        at function scope.  This suppresses further warnings
-        about this undeclared identifier in this function.  */
-      pushdecl_function_level (error_mark_node, id);
-    }
-}
-
 /* Build an external reference to identifier ID.  FUN indicates
    whether this will be used for a function call.  */
 tree