A program may erroneously reference the same name as both a data object and as a function. Some of these references were causing an internal error in expression analysis.
It was already the case that a symbol referenced in a parse tree for a call was changed from an Entity to a ProcEntity. I added code to detect when a symbol was referenced in a parse tree as an array element gets changed from an Entity to an ObjectEntity. Then, if an ObjectEntity gets called as a function or a ProcEntity gets referenced as a data object, errors get emitted.
This analysis was previously confined to the name resolution of the
specification part of a ProgramTree. I added a pass to the execution part of
a ProgramTree to catch names declared in blocks.
Why is this change needed? When would FindSymbol find the wrong symbol?