]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/50659 ([F03] ICE with PROCEDURE statement)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 15 Oct 2011 12:16:13 +0000 (14:16 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 15 Oct 2011 12:16:13 +0000 (14:16 +0200)
2011-10-15  Janus Weil  <janus@gcc.gnu.org>

PR fortran/50659
* expr.c (replace_symbol): Only do replacement if the symbol is a dummy.

2011-10-15  Janus Weil  <janus@gcc.gnu.org>

PR fortran/50659
* gfortran.dg/proc_decl_27.f90: New.

From-SVN: r180032

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_decl_27.f90 [new file with mode: 0644]

index f8d74f64a8ab0a82c5dbed1ca4a632e0c5da92db..3e310844ef525e5398afea01b2f7bc744c1842da 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/50659
+       * expr.c (replace_symbol): Only do replacement if the symbol is a dummy.
+
 2011-09-01  Mikael Morin  <mikael.morin@sfr.fr>
 
        PR fortran/50050
index 54e9725f6e69e9ce95758c9c7f40b7a7974a9da4..56c31e75399cf760032fbdf8a1271441c07b21b3 100644 (file)
@@ -3609,8 +3609,9 @@ gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
   return error_found ? FAILURE : SUCCESS;
 }
 
-/* Walk an expression tree and replace all symbols with a corresponding symbol
-   in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
+
+/* Walk an expression tree and replace all dummy symbols by the corresponding
+   symbol in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
    statements. The boolean return value is required by gfc_traverse_expr.  */
 
 static bool
@@ -3619,14 +3620,12 @@ replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
   if ((expr->expr_type == EXPR_VARIABLE 
        || (expr->expr_type == EXPR_FUNCTION
           && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
-      && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
-    {
-      gfc_symtree *stree;
-      gfc_namespace *ns = sym->formal_ns;
-      /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
-        the symtree rather than create a new one (and probably fail later).  */
-      stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
-                               expr->symtree->n.sym->name);
+      && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns
+      && expr->symtree->n.sym->attr.dummy)
+    {
+      gfc_symtree *root = sym->formal_ns ? sym->formal_ns->sym_root
+                                        : gfc_current_ns->sym_root;
+      gfc_symtree *stree = gfc_find_symtree (root, expr->symtree->n.sym->name);
       gcc_assert (stree);
       stree->n.sym->attr = expr->symtree->n.sym->attr;
       expr->symtree = stree;
index 8ccbd7ebc5ceeaded33c93de4c33d1777cb7b486..474b7283fae5cb674a41b72e3997b177eb104e96 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/50659
+       * gfortran.dg/proc_decl_27.f90: New.
+
 2011-10-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/50618
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_27.f90 b/gcc/testsuite/gfortran.dg/proc_decl_27.f90
new file mode 100644 (file)
index 0000000..30ff4de
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+!
+! PR 50659: [4.5/4.6/4.7 Regression] [F03] ICE on invalid with procedure interface
+!
+! Contributed by Andrew Benson <abenson@caltech.edu>
+
+module m1
+  integer :: arrSize
+end module
+
+module m2
+contains
+  function Proc (arg)
+    use m1
+    double precision, dimension(arrSize) :: proc
+    double precision :: arg
+  end function
+end
+
+  use m2
+  implicit none
+  procedure(Proc) :: Proc_Get
+end
+
+! { dg-final { cleanup-modules "m1 m2" } }