------- Comment #11 from burnus at gcc dot gnu dot org  2009-10-28 15:47 -------
Related problem:
  print *, loc(f2(a)) ! OK
  print *, loc(f (a)) ! Error "must be a variable"
The second line uses a generic function with "f2" being the specific one.

The problem is that gfc_check_loc calls check_variable, which checks whether
function name = result name. I think this check is bogus. I think the purpose
is to allow:
  function_name = value   ! in "function function_name" !
but for
  value = function_name(bar)  ! or LOC(function_name(bar))
it does not matter whether sym == sym->result.

On the other hand, if one is outside of "function function_name"
  func(function_name)
is something different (= function and not result) and there it does not matter
whether sym == sym->result or not.

For the the example above, the patch below fixes it, but see caveat above.

Index: check.c
===================================================================
--- check.c     (revision 153645)
+++ check.c     (working copy)
@@ -288,7 +288,10 @@ variable_check (gfc_expr *e, int n)
   if ((e->expr_type == EXPR_VARIABLE
        && e->symtree->n.sym->attr.flavor != FL_PARAMETER)
       || (e->expr_type == EXPR_FUNCTION
-         && e->symtree->n.sym->result == e->symtree->n.sym))
+         && ((!e->value.function.esym
+              && e->value.function.esym->result == e->value.function.esym)
+             || (e->value.function.esym
+                 && e->symtree->n.sym->result == e->symtree->n.sym))))
     return SUCCESS;

   if (e->expr_type == EXPR_VARIABLE


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41777

Reply via email to