>>> without any regressions. Can anybody think of a case where the names can
>>> be
>>> > identical, but the variables different? (I can't).
>>
>> Well, I'd say this can only happen if both variables reside in
>> different namespaces (i.e. different modules or procedures).
>>
>
> gfc_are_identical variables is only called from within gfc_dep_compare_expr.
> It makes no sense to call this function
> to compare expressions from different statements, unless one has carefully
> analyzed that no intervening assignment to the variables has taken place.
> Comparing across namespaces makes even less sense.
>
> So yes, I think it is enough if we compare the variable names, and
> document this in a commtent.
Actually, on second thought, I disagree.
For the original usage cases of gfc_dep_compare_expr, I'm not sure if
one can guarantee the expressions to be in the same namespace.
However, for the overriding checks, both expressions are guaranteed to
be in *different* namespaces (namely: two different procedures). And
as Mikael noted, it is crucial wether the symbols in the expressions
are dummy arguments or not:
1) Dummies are guaranteed to have equal names in overridden
procedures, so we can just compare names.
2) Non-dummies could have the same name, but still sit in different
namespaces, so for them we really have to check for equal symbols!
Here is a variant of the original test case from the PR, which will be
accepted if we only check for names (but it should actually be
rejected):
module world
implicit none
type :: world_1
contains
procedure, nopass :: string => w1_string
end type
type, extends(world_1) :: world_2
contains
procedure, nopass :: string => w2_string
end type
contains
function w1_string (m)
integer, parameter :: n = 5
integer, intent(in) :: m
character(n+m) :: w1_string
w1_string = "world"
end function
function w2_string (m)
integer, parameter :: n = 6
integer, intent(in) :: m
character(n+m) :: w2_string
w2_string = "world2"
end function
end module
Cheers,
Janus