[flang-commits] [PATCH] D143780: [flang] Catch misuse of a procedure designator as an output item
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Fri Feb 10 14:32:06 PST 2023
klausler created this revision.
klausler added a reviewer: vdonaldson.
klausler added a project: Flang.
Herald added subscribers: sunshaoce, jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
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.
https://reviews.llvm.org/D143780
Files:
flang/lib/Semantics/check-io.cpp
flang/lib/Semantics/expression.cpp
flang/test/Semantics/io04.f90
Index: flang/test/Semantics/io04.f90
===================================================================
--- flang/test/Semantics/io04.f90
+++ 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
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -564,10 +564,10 @@
std::optional<DataRef> 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();
Index: flang/lib/Semantics/check-io.cpp
===================================================================
--- flang/lib/Semantics/check-io.cpp
+++ 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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143780.496604.patch
Type: text/x-patch
Size: 2280 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230210/f10a8cd7/attachment.bin>
More information about the flang-commits
mailing list