forked from OSchip/llvm-project
![]() Change the order in which names are resolved. Before resolving names in the execution part of a subprogram we need to know the interface of contained subprograms. This is because the type of some construct entities can depend on the return type of contained functions, e.g. ``` associate(x => f()) end associate contains function f()... ``` To do this, we now build a tree rooted at each program unit with child nodes corresponding to subprograms contained in the parent. This provides flexibility in choosing an order to resolve names. The current implementation processes all specification parts before any execution parts. This ensures contained subprogram interfaces are know before analyzing constructs like ASSOCIATE. Resolving a specification part involves first adding `SubprogramNameDetails` symbols for each contained subprogram, then processing the statement that introduces the program unit (`ModuleStmt`, `SubroutineStmt`, etc.), then visiting all of the statements in the specification part. If it proves necessary, we can add a phase to do implicit declarations in the execution part before processing the specification part of contained subprograms. Original-commit: flang-compiler/f18@20e803fd92 Reviewed-on: https://github.com/flang-compiler/f18/pull/443 Tree-same-pre-rewrite: false |
||
---|---|---|
flang |