From aa128bb21ee37ce07b02043fde57914d60ff2097 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Thu, 2 Feb 2023 16:50:09 -0800 Subject: [PATCH] [flang] Catch misuse of a procedure designator as an output item f18 was diagnosing the misuse of a procedure pointer as an output item, but not the more general case of a procedure designator other than a pointer. Differential Revision: https://reviews.llvm.org/D143780 --- flang/lib/Semantics/check-io.cpp | 6 ++---- flang/lib/Semantics/expression.cpp | 8 ++++---- flang/test/Semantics/io04.f90 | 10 ++++++++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp index 349b34d7b811..bbe76c4cc93a 100644 --- a/flang/lib/Semantics/check-io.cpp +++ b/flang/lib/Semantics/check-io.cpp @@ -613,11 +613,9 @@ void IoChecker::Enter(const parser::OutputItem &item) { 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 index 116aa7f1504e..6eb08893129e 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -566,10 +566,10 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::Designator &d) { 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 index 92601193365c..685e43dd6e40 100644 --- 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 -- 2.34.1