348ccb784e
Add ObjectEntityDetails and ProcEntityDetails to distinguish between an entity from an object-decl and one from a proc-decl. When we don't know, it stays as EntityDetails until it is resolved. DeclareEntity() in DeclarationVisitor creates this kind of symbol. Add flags to Symbol as a convenient place for boolean flags common to many kinds of symbols. Use it to mark symbols known to be functions or subroutines so that we can report errors when they are used incorrectly. Improve handling of EXTERNAL statement. Handle ProcDecl nodes and add symbols for them. Partial processing of derived types. Data component declarations are processed and added to the derived type. Define TypeBoundProc and TypeBoundGeneric in type.h. Procedure components, type-bound procedures, etc. are not handled yet and nothing is done with the derived type once it is created. Eliminate DerivedTypeDefBuilder in favor of just setting fields in derivedTypeData_. Add GetDeclTypeSpec to go with BeginDeclTypeSpec and EndDeclTypeSpec, to avoid directly access the private variable. Add tests in resolve20.f90 for errors related to procedure declarations. Add missing copyrights to other tests. Original-commit: flang-compiler/f18@40e65c1465 Reviewed-on: https://github.com/flang-compiler/f18/pull/97 Tree-same-pre-rewrite: false
35 lines
985 B
Fortran
35 lines
985 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.
|
|
|
|
module m1
|
|
implicit none
|
|
contains
|
|
subroutine foo(x)
|
|
real :: x
|
|
end subroutine
|
|
end module
|
|
|
|
!Note: PGI, Intel, GNU, and NAG allow this; Sun does not
|
|
module m2
|
|
use m1
|
|
implicit none
|
|
!ERROR: 'foo' is already declared in this scoping unit
|
|
interface foo
|
|
module procedure s
|
|
end interface
|
|
contains
|
|
subroutine s(i)
|
|
integer :: i
|
|
end subroutine
|
|
end module
|