diff --git a/flang/lib/Semantics/check-do-forall.cpp b/flang/lib/Semantics/check-do-forall.cpp --- a/flang/lib/Semantics/check-do-forall.cpp +++ b/flang/lib/Semantics/check-do-forall.cpp @@ -1045,10 +1045,12 @@ template ActualArgumentSet CollectActualArguments(const SomeExpr &); void DoForallChecker::Leave(const parser::Expr &parsedExpr) { - if (const SomeExpr * expr{GetExpr(parsedExpr)}) { - ActualArgumentSet argSet{CollectActualArguments(*expr)}; - for (const evaluate::ActualArgumentRef &argRef : argSet) { - CheckIfArgIsDoVar(*argRef, parsedExpr.source, context_); + if (parsedExpr.typedExpr) { // typedExpr is empty on expressions with errors + if (const SomeExpr * expr{GetExpr(parsedExpr)}) { + ActualArgumentSet argSet{CollectActualArguments(*expr)}; + for (const evaluate::ActualArgumentRef &argRef : argSet) { + CheckIfArgIsDoVar(*argRef, parsedExpr.source, context_); + } } } } diff --git a/flang/test/Semantics/resolve91.f90 b/flang/test/Semantics/resolve91.f90 --- a/flang/test/Semantics/resolve91.f90 +++ b/flang/test/Semantics/resolve91.f90 @@ -44,3 +44,15 @@ real, dimension(:), pointer :: realArray => localArray end type end module m4 + +module m6 + integer, dimension(3) :: iarray + !ERROR: Derived type 'ubound' not found + character(len=ubound(iarray)(1)) :: first +end module m6 + +module m7 + integer, dimension(2) :: iarray + !ERROR: Derived type 'ubound' not found + integer :: ivar = ubound(iarray)(1) +end module m7