llvm-project/flang/test/Semantics/resolve36.f90

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

92 lines
2.1 KiB
Fortran
Raw Normal View History

! RUN: %S/test_errors.sh %s %t %f18
! C1568 The procedure-name shall have been declared to be a separate module
! procedure in the containing program unit or an ancestor of that program unit.
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
2019-07-31 06:29:50 +08:00
!ERROR: 't' is already declared in this scoping unit
!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-17 04:43:08 +08: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
! Separate module procedure defined in a submodule
module m4
interface
module subroutine a
end subroutine
module subroutine b
end subroutine
end interface
end module
submodule(m4) s4a
contains
module procedure a
end procedure
end submodule
submodule(m4:s4a) s4b
contains
module procedure b
end procedure
end