13e9617ea2
A `BLOCK` statement opens a new scope. It is different from other scopes in that implicitly typed entities are defined in the enclosing non-block scope, not immediately in the block. This means that `IMPORT` statements can cause them to be hidden. Check that blocks can't have `IMPLICIT` statements in them. It is simpler for the parser not to deal with the different between a specification-part and a block-specification-part. Change `ImplicitRules` to have a parent that is consulted when there isn't an answer in the current one. For an interface body that does not happen but for all other nested scopes it does. This parent link eliminates the need for the `implicitRules_` stack. Make `isImplicitNoneType_` and `isImplicitNoneExternal_` optional: not set means look in parent. Fixes flang-compiler/f18#71. Remove `CurrNonTypeScope()` and put the logic in `Symbol::FindSymbol`. Original-commit: flang-compiler/f18@a153a2ee33 Reviewed-on: https://github.com/flang-compiler/f18/pull/169 Tree-same-pre-rewrite: false
37 lines
1,003 B
Fortran
37 lines
1,003 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.
|
|
|
|
!ERROR: No explicit type declared for 'f'
|
|
function f()
|
|
implicit none
|
|
end
|
|
|
|
!ERROR: No explicit type declared for 'y'
|
|
subroutine s(x, y)
|
|
implicit none
|
|
integer :: x
|
|
end
|
|
|
|
subroutine s2
|
|
implicit none
|
|
block
|
|
!ERROR: No explicit type declared for 'i'
|
|
i = 1
|
|
end block
|
|
contains
|
|
subroutine s3
|
|
!ERROR: No explicit type declared for 'j'
|
|
j = 2
|
|
end subroutine
|
|
end subroutine
|