re PR fortran/36463 (gfc_get_default_type(): Bad symbol)
authorMikael Morin <mikael.morin@tele2.fr>
Tue, 25 Nov 2008 13:27:26 +0000 (14:27 +0100)
committerMikael Morin <mikael@gcc.gnu.org>
Tue, 25 Nov 2008 13:27:26 +0000 (13:27 +0000)
2008-11-25  Mikael Morin  <mikael.morin@tele2.fr>

PR fortran/36463
* expr.c (replace_symbol): Don't replace the symtree
if the expresion is an intrinsic function. Don't create
non-existent symtrees.  Use symbol's name instead of symtree's,
different in case of module procedure dummy arguments.

2008-11-25  Mikael Morin  <mikael.morin@tele2.fr>

PR fortran/36463
* gfortran.dg/proc_decl_20.f90: New test.

From-SVN: r142191

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

index a75f983f1bdd52068c931416465fcb07e14f1e5f..b22c8da5eaef87cc516798a4e4a4d19423755762 100644 (file)
@@ -1,3 +1,11 @@
+2008-11-25  Mikael Morin  <mikael.morin@tele2.fr>
+
+       PR fortran/36463
+       * expr.c (replace_symbol): Don't replace the symtree
+       if the expresion is an intrinsic function. Don't create
+       non-existent symtrees.  Use symbol's name instead of symtree's,
+       different in case of module procedure dummy arguments.
+
 2008-11-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        PR fortran/38248
index ea766537a500886a7025705434222eb2a9ca9e8d..4017cf91f331157f2fbeef0d995bc34d8da56f03 100644 (file)
@@ -3510,11 +3510,18 @@ gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
 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)
+  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_get_sym_tree (expr->symtree->name, sym->formal_ns, &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);
+      gcc_assert (stree);
       stree->n.sym->attr = expr->symtree->n.sym->attr;
       expr->symtree = stree;
     }
index 860fa8c4e99733fb939cdad91fcc6dcffface106..d3c09d1ecaac649189381f26c792b79056d8d7ce 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-25  Mikael Morin  <mikael.morin@tele2.fr>
+
+       PR fortran/36463
+       * gfortran.dg/proc_decl_20.f90: New test.
+
 2008-11-25  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/38151
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_20.f90 b/gcc/testsuite/gfortran.dg/proc_decl_20.f90
new file mode 100644 (file)
index 0000000..612dac1
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+!
+! PR fortran/36463
+! Gfortran used to fail on this testcase with: 
+! gfc_get_default_type(): Bad symbol '@0'
+!
+! Original program by James Van Buskirk
+! Reduced by Janus Weil <janus@gcc.gnu.org>
+
+module other_fun
+   interface
+      function abstract_fun(x)
+         integer x
+         integer abstract_fun(x)
+      end function abstract_fun
+   end interface
+end module other_fun
+
+ program fptr
+    use other_fun
+    procedure(abstract_fun) :: fun
+ end program fptr
+
+! { dg-final { cleanup-modules "other_fun" } }