d7ba02ab8c
Rework how `parser::Name` is resolved to contain a `Symbol`. so that constants in types can be evaluated. For example: ``` integer, parameter :: k = 8 integer(k) :: i ``` The old approach of collecting the symbols at the end of name resolution and filling in the `parser::Name` does not work because the type of `i` needs to be set in the symbol table. The symbol field in `parser::Name` is now mutable so that we can set it during name resolution. `RewriteParseTree` no longer needs to do that (it still warns about unresolved ones), so it does not need to collect symbols and fill them in. Consequently, we can eliminate "occurrences" from symbols -- we just need the name where each is first defined. This requires a lot of refactoring in `resolve-names.cc` to pass around `parser::Name` rather than `SourceName` so that we can resolve the name to a symbol. Fix some bugs where we stored `SourceName *` instead of `SourceName` in the symbol table. The pointers were into the parse tree, so they were only valid as long as the parse tree was around. The symbol table needs to remain valid longer than that, so the names need to be copied. `parser::Name` is not used in the symbol table. Eliminate `GenericSpec`. Currently all we need to do is to resolve the kinds of GenericSpec that contain names. Add `ScopeName` kind of `MiscDetails` for when we need a symbol in the scope to match the name of the scope. For example, `module m` cannot contain a declaration of a new `m`. Subprograms need real details because they can be called recursively. Fix output of partially resolved modules where we know it is a submodule but have not yet resolved the ancestor. Original-commit: flang-compiler/f18@5c1a4b99d2 Reviewed-on: https://github.com/flang-compiler/f18/pull/238 Tree-same-pre-rewrite: false
80 lines
2.1 KiB
Fortran
80 lines
2.1 KiB
Fortran
! Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
|
|
!
|
|
! Licensed under the Apache License, Version 2.0 (the "License");
|
|
! you may not use this file except in compliance with the License.
|
|
! You may obtain a copy of the License at
|
|
!
|
|
! http://www.apache.org/licenses/LICENSE-2.0
|
|
!
|
|
! Unless required by applicable law or agreed to in writing, software
|
|
! distributed under the License is distributed on an "AS IS" BASIS,
|
|
! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
! See the License for the specific language governing permissions and
|
|
! limitations under the License.
|
|
|
|
module m1
|
|
interface
|
|
module subroutine sub1(arg1)
|
|
integer, intent(inout) :: arg1
|
|
end subroutine
|
|
module integer function fun1()
|
|
end function
|
|
end interface
|
|
type t
|
|
end type
|
|
integer i
|
|
end module
|
|
|
|
submodule(m1) s1
|
|
contains
|
|
!ERROR: 'missing1' was not declared a separate module procedure
|
|
module procedure missing1
|
|
end
|
|
!ERROR: 'missing2' was not declared a separate module procedure
|
|
module subroutine missing2
|
|
end
|
|
!ERROR: 't' was not declared a separate module procedure
|
|
module procedure t
|
|
end
|
|
!ERROR: 'i' was not declared a separate module procedure
|
|
module subroutine i
|
|
end
|
|
end submodule
|
|
|
|
module m2
|
|
interface
|
|
module subroutine sub1(arg1)
|
|
integer, intent(inout) :: arg1
|
|
end subroutine
|
|
module integer function fun1()
|
|
end function
|
|
end interface
|
|
type t
|
|
end type
|
|
!ERROR: Declaration of 'i' conflicts with its use as module procedure
|
|
integer i
|
|
contains
|
|
!ERROR: 'missing1' was not declared a separate module procedure
|
|
module procedure missing1
|
|
end
|
|
!ERROR: 'missing2' was not declared a separate module procedure
|
|
module subroutine missing2
|
|
end
|
|
!ERROR: 't' was not declared a separate module procedure
|
|
module procedure t
|
|
end
|
|
!ERROR: 'i' was not declared a separate module procedure
|
|
module subroutine i
|
|
end
|
|
end module
|
|
|
|
! Separate module procedure defined in same module as declared
|
|
module m3
|
|
interface
|
|
module subroutine sub
|
|
end subroutine
|
|
end interface
|
|
contains
|
|
module procedure sub
|
|
end procedure
|
|
end module
|