llvm/flang/test/semantics/resolve40.f90
Tim Keith 2a43e78c17 [flang] Improvements to name resolution in data statements
Handle variables in data statements differently from implied dos:
If a variable is first mentioned in a data statement, it is implicitly
declared in the current scope (and subsequent type declarations only
confirm the type).
In the implied do case, the only variables that can be implicitly
declared are the iteration variables. They must be created in the new
ImpliedDos scope. There must be one such scope for each data-stmt-object
because the variable name can be reused.

Resolve references to named constants, e.g. in complex-literal-constant
and data-stmt-value. This requires changing the handling of
named-constant-def as that is a definition, not a reference.

Original-commit: flang-compiler/f18@9952b56af0
Reviewed-on: https://github.com/flang-compiler/f18/pull/277
Tree-same-pre-rewrite: false
2019-02-06 17:18:02 -08:00

88 lines
1.8 KiB
Fortran

! Copyright (c) 2019, 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 s1
namelist /nl/x
block
!ERROR: NAMELIST statement is not allowed in a BLOCK construct
namelist /nl/y
end block
end
subroutine s2
open(12, file='nl.out')
!ERROR: Namelist group 'nl' not found
write(12, nml=nl)
end
subroutine s3
real :: x
open(12, file='nl.out')
!ERROR: 'x' is not the name of a namelist group
write(12, nml=x)
end
module m4
real :: x
namelist /nl/x
end
subroutine s4a
use m4
namelist /nl2/x
open(12, file='nl.out')
write(12, nml=nl)
write(12, nml=nl2)
end
subroutine s4b
use m4
real :: y
!ERROR: 'nl' is already declared in this scoping unit
namelist /nl/y
end
subroutine s5
namelist /nl/x
!ERROR: The type of 'x' has already been implicitly declared
integer x
end
subroutine s6
!ERROR: 's6' is not a variable
namelist /nl/ s6
!ERROR: 'f' is not a variable
namelist /nl/ f
contains
integer function f()
f = 1
end
end
subroutine s7
real x
namelist /nl/ x
!ERROR: EXTERNAL attribute not allowed on 'x'
external x
end
subroutine s8
data x/1.0/
!ERROR: The type of 'x' has already been implicitly declared
integer x
end
subroutine s9
real :: x(4)
!ERROR: 'i' is already declared in this scoping unit
data ((x(i,i),i=1,2),i=1,2)/4*0.0/
end