2011-10-16 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 Oct 2011 22:06:19 +0000 (22:06 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 Oct 2011 22:06:19 +0000 (22:06 +0000)
* frontend-passes.c (current_ns):  Make static.
(create_var):  Note parent of newly created namespace.
(optimize_namespace):  Don't wak sibling namespaces
if they are EXEC_BLOCK because this is handled...
(gfc_code_walker):  ... here.  Also walk ASSOCIATE lists.

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

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c

index 6d7148d..1d515dc 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-16  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       * frontend-passes.c (current_ns):  Make static.
+       (create_var):  Note parent of newly created namespace.
+       (optimize_namespace):  Don't wak sibling namespaces
+       if they are EXEC_BLOCK because this is handled...
+       (gfc_code_walker):  ... here.  Also walk ASSOCIATE lists.
+
 2011-10-16  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/47023
index dcbaf06..5b1a644 100644 (file)
@@ -60,7 +60,7 @@ static gfc_code *inserted_block, **changed_statement;
 
 /* The namespace we are currently dealing with.  */
 
-gfc_namespace *current_ns;
+static gfc_namespace *current_ns;
 
 /* If we are within any forall loop.  */
 
@@ -261,6 +261,7 @@ create_var (gfc_expr * e)
       (*current_code)->next = NULL;
       /* Insert the BLOCK at the right position.  */
       *current_code = inserted_block;
+      ns->parent = current_ns;
     }
   else
     ns = inserted_block->ext.block.ns;
@@ -509,8 +510,12 @@ optimize_namespace (gfc_namespace *ns)
   gfc_code_walker (&ns->code, cfe_code, cfe_expr_0, NULL);
   gfc_code_walker (&ns->code, optimize_code, optimize_expr, NULL);
 
+  /* BLOCKs are handled in the expression walker below.  */
   for (ns = ns->contained; ns; ns = ns->sibling)
-    optimize_namespace (ns);
+    {
+      if (ns->code == NULL || ns->code->op != EXEC_BLOCK)
+       optimize_namespace (ns);
+    }
 }
 
 /* Replace code like
@@ -1143,6 +1148,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t codefn, walk_expr_fn_t exprfn,
          gfc_code *b;
          gfc_actual_arglist *a;
          gfc_code *co;
+         gfc_association_list *alist;
 
          /* There might be statement insertions before the current code,
             which must not affect the expression walker.  */
@@ -1151,6 +1157,13 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t codefn, walk_expr_fn_t exprfn,
 
          switch (co->op)
            {
+
+           case EXEC_BLOCK:
+             WALK_SUBCODE (co->ext.block.ns->code);
+             for (alist = co->ext.block.assoc; alist; alist = alist->next)
+               WALK_SUBEXPR (alist->target);
+             break;
+
            case EXEC_DO:
              WALK_SUBEXPR (co->ext.iterator->var);
              WALK_SUBEXPR (co->ext.iterator->start);