mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 10:26:06 +00:00
[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
This commit is contained in:
parent
57751e60e3
commit
aa128bb21e
@ -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)
|
||||
|
@ -566,10 +566,10 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::Designator &d) {
|
||||
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();
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user