llvm/flang/test/semantics/resolve36.f90

81 lines
2.1 KiB
Fortran
Raw Normal View History

! 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
[flang] Change when symbol is set in parser::Name 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@5c1a4b99d2421f5b32e83426488d3fdf7951cfba Reviewed-on: https://github.com/flang-compiler/f18/pull/238 Tree-same-pre-rewrite: false
2018-11-16 21:43:08 +01:00
! 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