diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp --- a/flang/lib/Semantics/check-io.cpp +++ b/flang/lib/Semantics/check-io.cpp @@ -613,11 +613,9 @@ if (evaluate::IsBOZLiteral(*expr)) { context_.Say(parser::FindSourceLocation(*x), // C7109 "Output item must not be a BOZ literal constant"_err_en_US); - } - const Symbol *last{GetLastSymbol(*expr)}; - if (last && IsProcedurePointer(*last)) { + } else if (IsProcedure(*expr)) { context_.Say(parser::FindSourceLocation(*x), - "Output item must not be a procedure pointer"_err_en_US); // C1233 + "Output item must not be a procedure"_err_en_US); // C1233 } CheckForBadIoType(*expr, flags_.test(Flag::FmtOrNml) 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 @@ -566,10 +566,10 @@ std::optional dataRef{ExtractDataRef(std::move(result))}; if (!dataRef) { dataRef = ExtractDataRef(std::move(result), /*intoSubstring=*/true); - if (!dataRef) { - dataRef = ExtractDataRef(std::move(result), - /*intoSubstring=*/false, /*intoComplexPart=*/true); - } + } + if (!dataRef) { + dataRef = ExtractDataRef(std::move(result), + /*intoSubstring=*/false, /*intoComplexPart=*/true); } if (dataRef && !CheckDataRef(*dataRef)) { result.reset(); diff --git a/flang/test/Semantics/io04.f90 b/flang/test/Semantics/io04.f90 --- a/flang/test/Semantics/io04.f90 +++ b/flang/test/Semantics/io04.f90 @@ -12,6 +12,8 @@ integer, pointer :: a(:) integer, parameter :: const_id = 66666 procedure(), pointer :: procptr + external external + intrinsic acos namelist /nnn/ nn1, nn2 @@ -134,8 +136,12 @@ write(*, '(X)') - !ERROR: Output item must not be a procedure pointer - print*, n1, procptr, n2 + !ERROR: Output item must not be a procedure + print*, procptr + !ERROR: Output item must not be a procedure + print*, acos + !ERROR: Output item must not be a procedure + print*, external 1 format (A) 9 continue