]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/36426 (Endless loop in gfc_apply_interface_mapping_to_expr)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 1 Nov 2008 21:56:27 +0000 (22:56 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 1 Nov 2008 21:56:27 +0000 (22:56 +0100)
2008-11-01  Janus Weil  <janus@gcc.gnu.org>

PR fortran/36426
* expr.c (replace_symbol): Replace all symbols which lie in the
formal namespace of the interface and copy their attributes.
* resolve.c (resolve_symbol): Add charlen to namespace.

2008-11-01  Janus Weil  <janus@gcc.gnu.org>

PR fortran/36426
* gfortran.dg/proc_decl_19.f90: New.

From-SVN: r141522

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

index 574ddc84e513d46ab8017876ad73f1228829947a..49b9e3f30f9b33dd9de00a2c39c71471da83740a 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-01  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/36426
+       * expr.c (replace_symbol): Replace all symbols which lie in the
+       formal namespace of the interface and copy their attributes.
+       * resolve.c (resolve_symbol): Add charlen to namespace.
+
 2008-11-01  Steven G. Kargl  <kargls@comcast.net>
 
        PR fortran/19925
index 2cebb65ee018c4cbfafd9055b72a110e826c060c..ea766537a500886a7025705434222eb2a9ca9e8d 100644 (file)
@@ -3511,12 +3511,11 @@ static bool
 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
 {
   if ((expr->expr_type == EXPR_VARIABLE || expr->expr_type == EXPR_FUNCTION)
-      && expr->symtree->n.sym->ns != sym->formal_ns
-      && expr->symtree->n.sym->attr.dummy)
+      && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
     {
       gfc_symtree *stree;
       gfc_get_sym_tree (expr->symtree->name, sym->formal_ns, &stree);
-      stree->n.sym->attr.referenced = expr->symtree->n.sym->attr.referenced;
+      stree->n.sym->attr = expr->symtree->n.sym->attr;
       expr->symtree = stree;
     }
   return false;
index c03f6a629d8b722d934bc1d945b7f63cd2979f35..bf21416cc235dd54ef8cb863898b189dec80eeb5 100644 (file)
@@ -8939,6 +8939,12 @@ resolve_symbol (gfc_symbol *sym)
              sym->ts.cl->resolved = ifc->ts.cl->resolved;
              sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
              gfc_expr_replace_symbols (sym->ts.cl->length, sym);
+             /* Add charlen to namespace.  */
+             if (sym->formal_ns)
+               {
+                 sym->ts.cl->next = sym->formal_ns->cl_list;
+                 sym->formal_ns->cl_list = sym->ts.cl;
+               }
            }
        }
       else if (sym->ts.interface->name[0] != '\0')
index 0328afb32dec84f411faf86b0dea4cfa23892f9d..cb6b0720d6013aa97d49c1230571b966d2fd858d 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-01  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/36426
+       * gfortran.dg/proc_decl_19.f90: New.
+
 2008-11-01  Steven G. Kargl  <kargls@comcast.net>
 
        PR fortran/19925
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_19.f90 b/gcc/testsuite/gfortran.dg/proc_decl_19.f90
new file mode 100644 (file)
index 0000000..1e85a7d
--- /dev/null
@@ -0,0 +1,23 @@
+! { dg-do compile }
+! 
+! PR 36426
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+abstract interface
+  function foo(x)
+    character(len=*) :: x
+    character(len=len(x)) :: foo
+  end function foo
+end interface
+procedure(foo) :: bar
+
+abstract interface
+  character function abs_fun()
+  end function
+end interface
+procedure(abs_fun):: x
+
+character(len=20) :: str
+str = bar("Hello")
+end