Patchwork Clean up f95-lang.c a bit

login
register
mail settings
Submitter Steven Bosscher
Date March 5, 2012, 11:30 p.m.
Message ID <CABu31nM7SLF3refaOjh7aJFpCXTM5oesTY9Jeo4SBG6zYVoaGQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/144802/
State New
Headers show

Comments

Steven Bosscher - March 5, 2012, 11:30 p.m.
Hello,

This is a long-overdue cleanup of f95-lang.c. This file was once added
as an almost one-to-one copy from one of the other languages and
tweaked until it worked. But the comments in the file are misleading,
out-dated, or wrong for other reasons, and there are remnants of the
pre tree-ssa era that never worked or were never used for gfortran.

Let's throw as much of that out as we can! (There will be a follow-up
patch to clean up convert.c also :-)

Bootstrapped&tested on x86_64-unknown-linux-gnu. OK?

Ciao!
Steven

        * f95-lang.c (yyerror, yylex): Remove.
        (clear_binding_stack): Remove, fold into its only user.
        (LANG_HOOKS_PRINT_IDENTIFIER): Do not re-define.
        (ridpointers): Remove.
        (gfc_eh_initialized_p): Make static.
        (gfc_truthvalue_conversion): Move to convert.c.
        (gfc_be_parse_file): Clear binding level stack when done.
        (gfc_print_identifier): Remove.
        (pushlevel): Remove ignored 'ignore' argument.  Update all callers.
        (poplevel): Remove unused 'reverse' argument.  Update all callers.
        (ggc_p): Remove.
        (gfc_builtin_function): Make static. Do not attempt to make RTL for
        builtin functions.
        * convert.c (gfc_truthvalue_conversion): Moved here from f95-lang.c,
        and made static.
        * trans.h (pushlevel, poplevel): Adjust prototypes.
        (gfc_truthvalue_conversion, gfc_builtin_function): Remove prototypes.
        * trans-openmp.c: Update calls to pushlevel and poplevel.
        * trans.c: Likewise.
        * trans-decl.c: Likewise.
* f95-lang.c (yyerror, yylex): Remove.
	(clear_binding_stack): Remove, fold into its only user.
	(LANG_HOOKS_PRINT_IDENTIFIER): Do not re-define.
	(ridpointers): Remove.
	(gfc_eh_initialized_p): Make static.
	(gfc_truthvalue_conversion): Move to convert.c.
	(gfc_be_parse_file): Clear binding level stack when done.
	(gfc_print_identifier): Remove.
	(pushlevel): Remove ignored 'ignore' argument.  Update all callers.
	(poplevel): Remove unused 'reverse' argument.  Update all callers.
	(ggc_p): Remove.
	(gfc_builtin_function): Make static. Do not attempt to make RTL for
	builtin functions.
	* convert.c (gfc_truthvalue_conversion): Moved here from f95-lang.c,
	and made static.
	* trans.h (pushlevel, poplevel): Adjust prototypes.
	(gfc_truthvalue_conversion, gfc_builtin_function): Remove prototypes.
	* trans-openmp.c: Update calls to pushlevel and poplevel.
	* trans.c: Likewise.
	* trans-decl.c: Likewise.
Tobias Burnus - March 6, 2012, 8:59 a.m.
On 03/06/2012 12:30 AM, Steven Bosscher wrote:
> This is a long-overdue cleanup of f95-lang.c. This file was once added
> as an almost one-to-one copy from one of the other languages and
> tweaked until it worked. But the comments in the file are misleading,
> out-dated, or wrong for other reasons, and there are remnants of the
> pre tree-ssa era that never worked or were never used for gfortran.
>
> Let's throw as much of that out as we can! (There will be a follow-up
> patch to clean up convert.c also :-)
>
> Bootstrapped&tested on x86_64-unknown-linux-gnu. OK?

OK. Thanks for the cleanup!

Tobias

Patch

Index: f95-lang.c
===================================================================
--- f95-lang.c	(revision 184956)
+++ f95-lang.c	(working copy)
@@ -60,7 +60,6 @@  lang_identifier {
 
 union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
      chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
-
 lang_tree_node {
   union tree_node GTY((tag ("0"),
 		       desc ("tree_node_structure (&%h)"))) generic;
@@ -77,25 +76,18 @@  language_function {
   struct binding_level *binding_level;
 };
 
-/* We don't have a lex/yacc lexer/parser, but toplev expects these to
-   exist anyway.  */
-void yyerror (const char *str);
-int yylex (void);
-
 static void gfc_init_decl_processing (void);
 static void gfc_init_builtin_functions (void);
+static bool global_bindings_p (void);
 
 /* Each front end provides its own.  */
 static bool gfc_init (void);
 static void gfc_finish (void);
 static void gfc_write_global_declarations (void);
-static void gfc_print_identifier (FILE *, tree, int);
-void do_function_end (void);
-bool global_bindings_p (void);
-static void clear_binding_stack (void);
 static void gfc_be_parse_file (void);
 static alias_set_type gfc_get_alias_set (tree);
 static void gfc_init_ts (void);
+static tree gfc_builtin_function (tree);
 
 #undef LANG_HOOKS_NAME
 #undef LANG_HOOKS_INIT
@@ -106,7 +98,6 @@  static void gfc_init_ts (void);
 #undef LANG_HOOKS_INIT_OPTIONS
 #undef LANG_HOOKS_HANDLE_OPTION
 #undef LANG_HOOKS_POST_OPTIONS
-#undef LANG_HOOKS_PRINT_IDENTIFIER
 #undef LANG_HOOKS_PARSE_FILE
 #undef LANG_HOOKS_MARK_ADDRESSABLE
 #undef LANG_HOOKS_TYPE_FOR_MODE
@@ -125,6 +116,7 @@  static void gfc_init_ts (void);
 #undef LANG_HOOKS_OMP_PRIVATE_OUTER_REF
 #undef LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES
 #undef LANG_HOOKS_BUILTIN_FUNCTION
+#undef LANG_HOOKS_BUILTIN_FUNCTION
 #undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
 
 /* Define lang hooks.  */
@@ -137,7 +129,6 @@  static void gfc_init_ts (void);
 #define LANG_HOOKS_INIT_OPTIONS         gfc_init_options
 #define LANG_HOOKS_HANDLE_OPTION        gfc_handle_option
 #define LANG_HOOKS_POST_OPTIONS		gfc_post_options
-#define LANG_HOOKS_PRINT_IDENTIFIER     gfc_print_identifier
 #define LANG_HOOKS_PARSE_FILE           gfc_be_parse_file
 #define LANG_HOOKS_TYPE_FOR_MODE	gfc_type_for_mode
 #define LANG_HOOKS_TYPE_FOR_SIZE	gfc_type_for_size
@@ -166,64 +157,13 @@  struct lang_hooks lang_hooks = LANG_HOOK
 
 static GTY(()) struct binding_level *free_binding_level;
 
-/* The elements of `ridpointers' are identifier nodes
-   for the reserved type names and storage classes.
-   It is indexed by a RID_... value.  */
-tree *ridpointers = NULL;
-
 /* True means we've initialized exception handling.  */
-bool gfc_eh_initialized_p;
+static bool gfc_eh_initialized_p;
 
 /* The current translation unit.  */
 static GTY(()) tree current_translation_unit;
 
 
-/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
-   or validate its data type for an `if' or `while' statement or ?..: exp.
-
-   This preparation consists of taking the ordinary
-   representation of an expression expr and producing a valid tree
-   boolean expression describing whether expr is nonzero.  We could
-   simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
-   but we optimize comparisons, &&, ||, and !.
-
-   The resulting type should always be `boolean_type_node'.
-   This is much simpler than the corresponding C version because we have a
-   distinct boolean type.  */
-
-tree
-gfc_truthvalue_conversion (tree expr)
-{
-  switch (TREE_CODE (TREE_TYPE (expr)))
-    {
-    case BOOLEAN_TYPE:
-      if (TREE_TYPE (expr) == boolean_type_node)
-	return expr;
-      else if (COMPARISON_CLASS_P (expr))
-	{
-	  TREE_TYPE (expr) = boolean_type_node;
-	  return expr;
-	}
-      else if (TREE_CODE (expr) == NOP_EXPR)
-        return fold_build1_loc (input_location, NOP_EXPR,
-			    boolean_type_node, TREE_OPERAND (expr, 0));
-      else
-        return fold_build1_loc (input_location, NOP_EXPR, boolean_type_node,
-				expr);
-
-    case INTEGER_TYPE:
-      if (TREE_CODE (expr) == INTEGER_CST)
-	return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
-      else
-        return fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
-				expr, build_int_cst (TREE_TYPE (expr), 0));
-
-    default:
-      internal_error ("Unexpected type in truthvalue_conversion");
-    }
-}
-
-
 static void
 gfc_create_decls (void)
 {
@@ -255,7 +195,9 @@  gfc_be_parse_file (void)
   errorcount += errors;
   warningcount += warnings;
 
-  clear_binding_stack ();
+  /* Clear the binding level stack.  */
+  while (!global_bindings_p ())
+    poplevel (0, 0);
 }
 
 
@@ -322,16 +264,6 @@  gfc_write_global_declarations (void)
   write_global_declarations ();
 }
 
-
-static void
-gfc_print_identifier (FILE * file ATTRIBUTE_UNUSED,
-		      tree node ATTRIBUTE_UNUSED,
-		      int indent ATTRIBUTE_UNUSED)
-{
-  return;
-}
-
-
 /* These functions and variables deal with binding contours.  We only
    need these functions for the list of PARM_DECLs, but we leave the
    functions more general; these are a simplified version of the
@@ -351,9 +283,7 @@  struct GTY(())
 binding_level {
   /* A chain of ..._DECL nodes for all variables, constants, functions,
      parameters and type declarations.  These ..._DECL nodes are chained
-     through the DECL_CHAIN field. Note that these ..._DECL nodes are stored
-     in the reverse of the order supplied to be compatible with the
-     back-end.  */
+     through the DECL_CHAIN field.  */
   tree names;
   /* For each level (except the global one), a chain of BLOCK nodes for all
      the levels that were entered and exited one level down from this one.  */
@@ -387,11 +317,10 @@  getdecls (void)
   return current_binding_level->names;
 }
 
-/* Enter a new binding level. The input parameter is ignored, but has to be
-   specified for back-end compatibility.  */
+/* Enter a new binding level. */
 
 void
-pushlevel (int ignore ATTRIBUTE_UNUSED)
+pushlevel (void)
 {
   struct binding_level *newlevel = ggc_alloc_binding_level ();
 
@@ -413,29 +342,19 @@  pushlevel (int ignore ATTRIBUTE_UNUSED)
 
    If FUNCTIONBODY is nonzero, this level is the body of a function,
    so create a block as if KEEP were set and also clear out all
-   label names.
-
-   If REVERSE is nonzero, reverse the order of decls before putting
-   them into the BLOCK.  */
+   label names.  */
 
 tree
-poplevel (int keep, int reverse, int functionbody)
+poplevel (int keep, int functionbody)
 {
   /* Points to a BLOCK tree node. This is the BLOCK node constructed for the
      binding level that we are about to exit and which is returned by this
      routine.  */
   tree block_node = NULL_TREE;
-  tree decl_chain;
+  tree decl_chain = current_binding_level->names;
   tree subblock_chain = current_binding_level->blocks;
   tree subblock_node;
 
-  /* Reverse the list of XXXX_DECL nodes if desired.  Note that the ..._DECL
-     nodes chained through the `names' field of current_binding_level are in
-     reverse order except for PARM_DECL node, which are explicitly stored in
-     the right order.  */
-  decl_chain = (reverse) ? nreverse (current_binding_level->names)
-			 : current_binding_level->names;
-
   /* If there were any declarations in the current binding level, or if this
      binding level is a function body, or if there are any nested blocks then
      create a BLOCK node to record them for the life of this function.  */
@@ -513,10 +432,7 @@  pushdecl (tree decl)
       DECL_CONTEXT (decl) = current_function_decl;
     }
 
-  /* Put the declaration on the list.  The list of declarations is in reverse
-     order. The list will be reversed later if necessary.  This needs to be
-     this way for compatibility with the back-end.  */
-
+  /* Put the declaration on the list.  */
   DECL_CHAIN (decl) = current_binding_level->names;
   current_binding_level->names = decl;
 
@@ -548,16 +464,6 @@  pushdecl_top_level (tree x)
   return t;
 }
 
-
-/* Clear the binding stack.  */
-static void
-clear_binding_stack (void)
-{
-  while (!global_bindings_p ())
-    poplevel (0, 0, 0);
-}
-
-
 #ifndef CHAR_TYPE_SIZE
 #define CHAR_TYPE_SIZE BITS_PER_UNIT
 #endif
@@ -582,7 +488,7 @@  gfc_init_decl_processing (void)
 
   /* Make the binding_level structure for global names. We move all
      variables that are in a COMMON block to this binding level.  */
-  pushlevel (0);
+  pushlevel ();
   global_binding_level = current_binding_level;
 
   /* Build common tree nodes. char_type_node is unsigned because we
@@ -617,17 +523,11 @@  gfc_get_alias_set (tree t)
   return -1;
 }
 
-
-/* press the big red button - garbage (ggc) collection is on */
-
-int ggc_p = 1;
-
 /* Builtin function initialization.  */
 
-tree
+static tree
 gfc_builtin_function (tree decl)
 {
-  make_decl_rtl (decl);
   pushdecl (decl);
   return decl;
 }
Index: convert.c
===================================================================
--- convert.c	(revision 184956)
+++ convert.c	(working copy)
@@ -60,6 +60,50 @@  along with GCC; see the file COPYING3.  
 
 /* Subroutines of `convert'.  */
 
+/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
+   or validate its data type for an `if' or `while' statement or ?..: exp.
+
+   This preparation consists of taking the ordinary
+   representation of an expression expr and producing a valid tree
+   boolean expression describing whether expr is nonzero.  We could
+   simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
+   but we optimize comparisons, &&, ||, and !.
+
+   The resulting type should always be `boolean_type_node'.
+   This is much simpler than the corresponding C version because we have a
+   distinct boolean type.  */
+
+static tree
+gfc_truthvalue_conversion (tree expr)
+{
+  switch (TREE_CODE (TREE_TYPE (expr)))
+    {
+    case BOOLEAN_TYPE:
+      if (TREE_TYPE (expr) == boolean_type_node)
+	return expr;
+      else if (COMPARISON_CLASS_P (expr))
+	{
+	  TREE_TYPE (expr) = boolean_type_node;
+	  return expr;
+	}
+      else if (TREE_CODE (expr) == NOP_EXPR)
+        return fold_build1_loc (input_location, NOP_EXPR,
+			    boolean_type_node, TREE_OPERAND (expr, 0));
+      else
+        return fold_build1_loc (input_location, NOP_EXPR, boolean_type_node,
+				expr);
+
+    case INTEGER_TYPE:
+      if (TREE_CODE (expr) == INTEGER_CST)
+	return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
+      else
+        return fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+				expr, build_int_cst (TREE_TYPE (expr), 0));
+
+    default:
+      internal_error ("Unexpected type in truthvalue_conversion");
+    }
+}
 
 /* Create an expression whose value is that of EXPR,
    converted to type TYPE.  The TREE_TYPE of the value
Index: trans.h
===================================================================
--- trans.h	(revision 184956)
+++ trans.h	(working copy)
@@ -427,8 +427,6 @@  int gfc_conv_procedure_call (gfc_se *, g
 
 void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent, bool);
 
-/* gfc_trans_* shouldn't call push/poplevel, use gfc_push/pop_scope */
-
 /* Generate code for a scalar assignment.  */
 tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, gfc_typespec, bool, bool,
 			      bool);
@@ -632,11 +630,9 @@  void gfc_trans_deferred_vars (gfc_symbol
 /* In f95-lang.c.  */
 tree pushdecl (tree);
 tree pushdecl_top_level (tree);
-void pushlevel (int);
-tree poplevel (int, int, int);
+void pushlevel (void);
+tree poplevel (int, int);
 tree getdecls (void);
-tree gfc_truthvalue_conversion (tree);
-tree gfc_builtin_function (tree);
 
 /* In trans-types.c.  */
 struct array_descr_info;
Index: trans-openmp.c
===================================================================
--- trans-openmp.c	(revision 184956)
+++ trans-openmp.c	(working copy)
@@ -651,7 +651,7 @@  gfc_trans_omp_array_reduction (tree c, g
   gcc_assert (t == SUCCESS);
 
   /* Create the init statement list.  */
-  pushlevel (0);
+  pushlevel ();
   if (GFC_DESCRIPTOR_TYPE_P (type)
       && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
     {
@@ -691,13 +691,13 @@  gfc_trans_omp_array_reduction (tree c, g
   else
     stmt = gfc_trans_assignment (e1, e2, false, false);
   if (TREE_CODE (stmt) != BIND_EXPR)
-    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   OMP_CLAUSE_REDUCTION_INIT (c) = stmt;
 
   /* Create the merge statement list.  */
-  pushlevel (0);
+  pushlevel ();
   if (GFC_DESCRIPTOR_TYPE_P (type)
       && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
     {
@@ -714,9 +714,9 @@  gfc_trans_omp_array_reduction (tree c, g
   else
     stmt = gfc_trans_assignment (e3, e4, false, true);
   if (TREE_CODE (stmt) != BIND_EXPR)
-    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   OMP_CLAUSE_REDUCTION_MERGE (c) = stmt;
 
   /* And stick the placeholder VAR_DECL into the clause as well.  */
@@ -1001,20 +1001,20 @@  gfc_trans_omp_code (gfc_code *code, bool
 {
   tree stmt;
 
-  pushlevel (0);
+  pushlevel ();
   stmt = gfc_trans_code (code);
   if (TREE_CODE (stmt) != BIND_EXPR)
     {
       if (!IS_EMPTY_STMT (stmt) || force_empty)
 	{
-	  tree block = poplevel (1, 0, 0);
+	  tree block = poplevel (1, 0);
 	  stmt = build3_v (BIND_EXPR, NULL, stmt, block);
 	}
       else
-	poplevel (0, 0, 0);
+	poplevel (0, 0);
     }
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   return stmt;
 }
 
@@ -1501,7 +1501,7 @@  gfc_trans_omp_do (gfc_code *code, stmtbl
 
   if (pblock != &block)
     {
-      pushlevel (0);
+      pushlevel ();
       gfc_start_block (&block);
     }
 
@@ -1612,12 +1612,12 @@  gfc_trans_omp_parallel_do (gfc_code *cod
   if (!do_clauses.ordered && do_clauses.sched_kind != OMP_SCHED_STATIC)
     pblock = &block;
   else
-    pushlevel (0);
+    pushlevel ();
   stmt = gfc_trans_omp_do (code, pblock, &do_clauses, omp_clauses);
   if (TREE_CODE (stmt) != BIND_EXPR)
-    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
 		     omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
@@ -1638,12 +1638,12 @@  gfc_trans_omp_parallel_sections (gfc_cod
   gfc_start_block (&block);
   omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
 				       code->loc);
-  pushlevel (0);
+  pushlevel ();
   stmt = gfc_trans_omp_sections (code, &section_clauses);
   if (TREE_CODE (stmt) != BIND_EXPR)
-    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
 		     omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
@@ -1664,12 +1664,12 @@  gfc_trans_omp_parallel_workshare (gfc_co
   gfc_start_block (&block);
   omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
 				       code->loc);
-  pushlevel (0);
+  pushlevel ();
   stmt = gfc_trans_omp_workshare (code, &workshare_clauses);
   if (TREE_CODE (stmt) != BIND_EXPR)
-    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
   stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
 		     omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
@@ -1763,7 +1763,7 @@  gfc_trans_omp_workshare (gfc_code *code,
 
   code = code->block->next;
 
-  pushlevel (0);
+  pushlevel ();
 
   gfc_start_block (&block);
   pblock = &block;
@@ -1892,14 +1892,14 @@  gfc_trans_omp_workshare (gfc_code *code,
     {
       if (!IS_EMPTY_STMT (stmt))
 	{
-	  tree bindblock = poplevel (1, 0, 0);
+	  tree bindblock = poplevel (1, 0);
 	  stmt = build3_v (BIND_EXPR, NULL, stmt, bindblock);
 	}
       else
-	poplevel (0, 0, 0);
+	poplevel (0, 0);
     }
   else
-    poplevel (0, 0, 0);
+    poplevel (0, 0);
 
   if (IS_EMPTY_STMT (stmt) && !clauses->nowait)
     stmt = gfc_trans_omp_barrier ();
Index: trans.c
===================================================================
--- trans.c	(revision 184956)
+++ trans.c	(working copy)
@@ -182,7 +182,7 @@  void
 gfc_start_block (stmtblock_t * block)
 {
   /* Start a new binding level.  */
-  pushlevel (0);
+  pushlevel ();
   block->has_scope = 1;
 
   /* The block is empty.  */
@@ -215,7 +215,7 @@  gfc_merge_block_scope (stmtblock_t * blo
 
   /* Remember the decls in this scope.  */
   decl = getdecls ();
-  poplevel (0, 0, 0);
+  poplevel (0, 0);
 
   /* Add them to the parent scope.  */
   while (decl != NULL_TREE)
@@ -250,11 +250,11 @@  gfc_finish_block (stmtblock_t * stmtbloc
 
       if (decl)
 	{
-	  block = poplevel (1, 0, 0);
+	  block = poplevel (1, 0);
 	  expr = build3_v (BIND_EXPR, decl, expr, block);
 	}
       else
-	poplevel (0, 0, 0);
+	poplevel (0, 0);
     }
 
   return expr;
Index: trans-decl.c
===================================================================
--- trans-decl.c	(revision 184956)
+++ trans-decl.c	(working copy)
@@ -2256,7 +2256,7 @@  trans_function_start (gfc_symbol * sym)
   init_function_start (fndecl);
 
   /* function.c requires a push at the start of the function.  */
-  pushlevel (0);
+  pushlevel ();
 }
 
 /* Create thunks for alternate entry points.  */
@@ -2398,7 +2398,7 @@  build_entry_thunks (gfc_namespace * ns, 
       /* Finish off this function and send it for code generation.  */
       DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
       tmp = getdecls ();
-      poplevel (1, 0, 1);
+      poplevel (1, 1);
       BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
       DECL_SAVED_TREE (thunk_fndecl)
 	= build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
@@ -4400,7 +4400,7 @@  generate_coarray_init (gfc_namespace * n
   make_decl_rtl (fndecl);
   init_function_start (fndecl);
 
-  pushlevel (0);
+  pushlevel ();
   gfc_init_block (&caf_init_block);
 
   gfc_traverse_ns (ns, generate_coarray_sym_init);
@@ -4408,7 +4408,7 @@  generate_coarray_init (gfc_namespace * n
   DECL_SAVED_TREE (fndecl) = gfc_finish_block (&caf_init_block);
   decl = getdecls ();
 
-  poplevel (1, 0, 1);
+  poplevel (1, 1);
   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
 
   DECL_SAVED_TREE (fndecl)
@@ -4971,7 +4971,7 @@  create_main_function (tree fndecl)
   rest_of_decl_compilation (ftn_main, 1, 0);
   make_decl_rtl (ftn_main);
   init_function_start (ftn_main);
-  pushlevel (0);
+  pushlevel ();
 
   gfc_init_block (&body);
 
@@ -5139,7 +5139,7 @@  create_main_function (tree fndecl)
   decl = getdecls ();
 
   /* Finish off this function and send it for code generation.  */
-  poplevel (1, 0, 1);
+  poplevel (1, 1);
   BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
 
   DECL_SAVED_TREE (ftn_main)
@@ -5428,7 +5428,7 @@  gfc_generate_function_code (gfc_namespac
   decl = getdecls ();
 
   /* Finish off this function and send it for code generation.  */
-  poplevel (1, 0, 1);
+  poplevel (1, 1);
   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
 
   DECL_SAVED_TREE (fndecl)
@@ -5522,7 +5522,7 @@  gfc_generate_constructors (void)
 
   init_function_start (fndecl);
 
-  pushlevel (0);
+  pushlevel ();
 
   for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
     {
@@ -5532,7 +5532,7 @@  gfc_generate_constructors (void)
     }
 
   decl = getdecls ();
-  poplevel (1, 0, 1);
+  poplevel (1, 1);
 
   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
   DECL_SAVED_TREE (fndecl)