OSDN Git Service

2008-11-01 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Nov 2008 21:56:27 +0000 (21:56 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Nov 2008 21:56:27 +0000 (21:56 +0000)
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.

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

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 574ddc8..49b9e3f 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 2cebb65..ea76653 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 c03f6a6..bf21416 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 0328afb..cb6b072 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