https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98890
Tobias Burnus <burnus at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |burnus at gcc dot gnu.org
Keywords| |ice-on-invalid-code
--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Likewise for the following, which uses an assignment:
implicit none
contains
real function bar(x)
real :: x(2,2)
bar = bar ! OK
bar = baz ! ERROR: function name not reference
bar = get_funptr() ! ERROR: proc-pointer returning function
bar = bar * x(1,1) ! OK
bar = baz * x(1,1) ! error - as above but as operator
bar = get_funptr() * x(1,1) ! likewise
end function bar
function get_funptr() result(ptr)
procedure(bar), pointer :: ptr
ptr => bar
end
real function baz(x) result(bazr)
real :: x(2,2)
bazr=x(1,1)
end function baz
end module foo
* * *
I am not sure whether the problem is that expr_type == EXPR_VARIABLE instead of
expr_type == EXPR_FUNCTION
or whether the proper fix should be inside both resolve_ordinary_assign() and
resolve_operator() a check like:
symbol_attribute rhs_attr = gfc_expr_attr (rhs);
if (rhs_attr.function && ...)
{
gfc_error ("Unexpected function name at %L", &rhs->where);
return false;
}
if (rhs_attr.proc_pointer)
{
gfc_error ("Unexpected procedure pointer at %L", &rhs->where);
return false;
}
where "..." detects that the rhs may be used as result name in this context.
This check always confuses me. And a quick try failed:
I tried rhs_attr – but it is identical for 'bar' and baz'; and also
'sym->result = sym' is the same (if changing 'baz' to use no result variable).
I also thought about the namespace but thanks to BLOCK and contained procedures
(which may access their parent's result variable) it is not that simple.
* * *
I have not checked but, e.g., for 'call foo(baz)' a similar issue may pop up. I
think not occurring, but to check: proc_pointer_comp (should be resolved
already at parse time?) and derived-type procedures returning proc pointers
(same check as for other functions).