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

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

40 lines
809 B
Fortran
Raw Normal View History

! RUN: %S/test_errors.sh %s %t %f18
subroutine s1
integer x
block
import, none
!ERROR: 'x' from host scoping unit is not accessible due to IMPORT
x = 1
end block
end
subroutine s2
block
import, none
!ERROR: 'y' from host scoping unit is not accessible due to IMPORT
y = 1
end block
end
subroutine s3
implicit none
integer :: i, j
block
import, none
!ERROR: No explicit type declared for 'i'
real :: a(16) = [(i, i=1, 16)]
real :: b(16)
!ERROR: No explicit type declared for 'j'
data(b(j), j=1, 16) / 16 * 0.0 /
end block
end
subroutine s4
real :: i, j
[flang] Continue semantic checking after name resolution error When an error occurs in name resolution, continue semantic processing in order to detect other errors. This means we can no longer assume that every `parser::Name` has a symbol even after name resolution completes. In `RewriteMutator`, only report internal error for unresolved symbol if there have been no fatal errors. Add `Error` flag to `Symbol` to indicate that an error occcurred related to it. Once we report an error about a symbol we should avoid reporting any more to prevent cascading errors. Add `HasError()` and `SetError()` to simplify working with this flag. Change some places that we assume that a `parser::Name` has a non-null symbol. There are probably more. `resolve-names.cc`: Set the `Error` flag when we report a fatal error related to a symbol. (This requires making some symbols non-const.) Remove `CheckScalarIntegerType()` as `ExprChecker` will take care of those constraints if they are expressed in the parse tree. One exception to that is the name in a `ConcurrentControl`. Explicitly perform that check using `EvaluateExpr()` and constraint classes so we get consistent error messages. In expression analysis, when a constraint is violated (like `Scalar<>` or `Integer<>`), reset the wrapped expression so that we don't assume it is valid. A `GenericExprWrapper` holding a std::nullopt indicates error. Change `EnforceTypeConstraint()` to return false when the constraint fails to enable this. check-do-concurrent.cc: Reorganize the Gather*VariableNames functions into one to simplify the task of filtering out unresolved names. Remove `CheckNoDuplicates()` and `CheckNoCollisions()` as those checks is already done in name resolution when the names are added to the scope. Original-commit: flang-compiler/f18@bcdb679405906575f36d3314f17da89e3e89d45c Reviewed-on: https://github.com/flang-compiler/f18/pull/429 Tree-same-pre-rewrite: false
2019-04-26 04:18:33 +08:00
!ERROR: Must have INTEGER type, but is REAL(4)
real :: a(16) = [(i, i=1, 16)]
real :: b(16)
!ERROR: Must have INTEGER type, but is REAL(4)
data(b(j), j=1, 16) / 16 * 0.0 /
end