4c99dc2a94
Add subprogram symbols for each interface-body and set isInterface on them. Create a symbol with GenericDetails for each generic interface block and add interface specifications to the specific procedures of the generic. InterfaceVisitor takes care of this. Before processing the specification part of modules and subprograms, collect the names of module subprograms and internal subprograms and add them to the symbol table with SubprogramNameDetails. This allows us to reference them from interface blocks in the specification part. SubprogramNameDetails is converted to SubprogramDetails when the real subprogram is visited. This is achieved by setting subpNamesOnly_ and then walking the ModuleSubprogramPart or InternalSubprogramPart. Creating the symbol and scope for a module or subprogram now happens when the Module, SubroutineSubprogram, or FunctionSubprogram node is encountered so this can happen in the right order. Add BeginSubprogram and EndSubprogram to handle the parts in common between subprograms and interface specifications. Add GenericSpec to type.h to represent all possible generic specs. Only generic names are resolved so far. Add tests for new error messages. Change resolve02.f90 to reflect the new errors reported. Original-commit: flang-compiler/f18@03148b49dd Reviewed-on: https://github.com/flang-compiler/f18/pull/88 Tree-same-pre-rewrite: false
29 lines
872 B
Fortran
29 lines
872 B
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.
|
|
|
|
subroutine s
|
|
!ERROR: Declaration of 'x' conflicts with its use as internal procedure
|
|
real :: x
|
|
contains
|
|
subroutine x
|
|
end
|
|
end
|
|
|
|
module m
|
|
!ERROR: Declaration of 'x' conflicts with its use as module procedure
|
|
real :: x
|
|
contains
|
|
subroutine x
|
|
end
|
|
end
|