diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -909,7 +909,10 @@ return std::nullopt; } else if (baseExpr->Rank() == 0) { if (const Symbol * symbol{GetLastSymbol(*baseExpr)}) { - Say("'%s' is not an array"_err_en_US, symbol->name()); + if (!context_.HasError(symbol)) { + Say("'%s' is not an array"_err_en_US, symbol->name()); + context_.SetError(const_cast(*symbol)); + } } } else if (std::optional dataRef{ ExtractDataRef(std::move(*baseExpr))}) { diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -5505,7 +5505,15 @@ }, [&](const Indirection &y) { Walk(y.value().subscripts); - return ResolveDataRef(y.value().base); + const parser::Name *name{ResolveDataRef(y.value().base)}; + if (!name) { + } else if (!name->symbol->has()) { + ConvertToObjectEntity(*name->symbol); + } else if (!context().HasError(*name->symbol)) { + SayWithDecl(*name, *name->symbol, + "Cannot reference function '%s' as data"_err_en_US); + } + return name; }, [&](const Indirection &y) { Walk(y.value().imageSelector); diff --git a/flang/test/Semantics/resolve93.f90 b/flang/test/Semantics/resolve93.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/resolve93.f90 @@ -0,0 +1,44 @@ +! RUN: %S/test_errors.sh %s %t %f18 +subroutine s1() + character(10) str + character(10) str1 + !ERROR: Cannot reference function 'str' as data + print *, str(1:9), str(7) + block + character(10) str2 + character(10) str3 + !ERROR: Cannot reference function 'str1' as data + print *, str1(1:9), str1(7) + !ERROR: 'str2' is not an array + print *, str2(1:9), str2(7) + !ERROR: Cannot reference function 'str3' as data + print *, str3(7), str3(1:9) + end block +end subroutine s1 + +subroutine s2() + character(10) func + !ERROR: Cannot reference function 'func' as data + print *, func(7), func(1:9) +end subroutine s2 + +subroutine s3() + real(8) :: func + !ERROR: Cannot reference function 'func' as data + print *, func(7), func(1:6) +end subroutine s3 + +subroutine s4() + real(8) :: local + real(8) :: local1 + !ERROR: Cannot reference function 'local' as data + print *, local(1:6), local(7) + !ERROR: Cannot reference function 'local1' as data + print *, local1(7), local1(1:6) +end subroutine s4 + +subroutine s5(arg) + integer :: iVar + external :: arg + iVar = loc(arg) +end subroutine s5