Hi Tobias,
I am afraid we're really opening a can of worms here....
> Additionally, I wonder whether that will work with:
>
> integer, pointer :: ptr
> integer function f()
> pointer :: f
> f = ptr
> end
> allocate(A, stat=f())
>
> The f() is a variable and definable – but I am currently not sure it sets
> stat->symtree
> and not only stat->value.function.esym, but I have not tested it.
I think a "working" testcase for this could be:
program p
implicit none
integer, target :: ptr
integer, pointer :: A
allocate (A, stat=f())
print *, ptr
contains
function f()
integer, pointer :: f
f => ptr
end function f
end
This works as expected with Intel and AOCC, but gives a
syntax error with every gfortran tested because of match.c:
alloc_opt_list:
m = gfc_match (" stat = %v", &tmp);
where the comment before gfc_match states:
%v Matches a variable expression (an lvalue)
although it matches only variables and not every type of lvalue.
We therefore never get to the interesting checks elsewhere...
> Additionally, I have to admit that I do not understand the
> following existing condition, which you did not touch:
>
> if ((stat->ts.type != BT_INTEGER
> && !(stat->ref && (stat->ref->type == REF_ARRAY
> || stat->ref->type == REF_COMPONENT)))
> || stat->rank > 0)
> gfc_error ("Stat-variable at %L must be a scalar INTEGER "
> "variable", &stat->where);
>
> I mean the ts.type != BT_INTEGER and stat->rank != 0 is clear,
> but what's the reason for the refs?
Well, that needs to be answered by Steve (see commit 3759634).
[...]
> And possibly add a testcase for stat=f() [valid]
> and stat=x%y%kind [invalid] as well?
Well, I need to go back to the drawing board then...
Thanks,
Harald