Skip to content

Commit d90e866

Browse files
committed
[flang][runtime] INQUIRE(UNIT=666,NUMBER=n) must set n=666
Whether a unit number in an inquire-by-unit statement is valid or not, it should be the value to which the NUMBER= variable is set, not -1. -1 should be returned to NUMBER= only for an inquire-by-file statement when the FILE= is not connected to any unit. Differential Revision: https://reviews.llvm.org/D126145
1 parent 28432b0 commit d90e866

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

flang/runtime/io-api.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ Cookie IONAME(BeginClose)(
360360
} else {
361361
// CLOSE(UNIT=bad unit) is just a no-op
362362
Terminator oom{sourceFile, sourceLine};
363-
return &New<NoopStatementState>{oom}(sourceFile, sourceLine)
363+
return &New<NoopStatementState>{oom}(sourceFile, sourceLine, unitNumber)
364364
.release()
365365
->ioStatementState();
366366
}
@@ -374,7 +374,7 @@ Cookie IONAME(BeginFlush)(
374374
} else {
375375
// FLUSH(UNIT=unknown) is a no-op
376376
Terminator oom{sourceFile, sourceLine};
377-
return &New<NoopStatementState>{oom}(sourceFile, sourceLine)
377+
return &New<NoopStatementState>{oom}(sourceFile, sourceLine, unitNumber)
378378
.release()
379379
->ioStatementState();
380380
}
@@ -420,7 +420,7 @@ Cookie IONAME(BeginInquireUnit)(
420420
} else {
421421
// INQUIRE(UNIT=unrecognized unit)
422422
Terminator oom{sourceFile, sourceLine};
423-
return &New<InquireNoUnitState>{oom}(sourceFile, sourceLine)
423+
return &New<InquireNoUnitState>{oom}(sourceFile, sourceLine, unitNumber)
424424
.release()
425425
->ioStatementState();
426426
}

flang/runtime/io-stmt.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ bool InquireUnitState::Inquire(
12701270
}
12711271
return true;
12721272
case HashInquiryKeyword("NUMBER"):
1273-
result = unit().IsConnected() ? unit().unitNumber() : -1;
1273+
result = unit().unitNumber();
12741274
return true;
12751275
case HashInquiryKeyword("POS"):
12761276
result = unit().InquirePos();
@@ -1300,8 +1300,9 @@ bool InquireUnitState::Inquire(
13001300
}
13011301
}
13021302

1303-
InquireNoUnitState::InquireNoUnitState(const char *sourceFile, int sourceLine)
1304-
: NoUnitIoStatementState{sourceFile, sourceLine, *this} {}
1303+
InquireNoUnitState::InquireNoUnitState(
1304+
const char *sourceFile, int sourceLine, int badUnitNumber)
1305+
: NoUnitIoStatementState{*this, sourceFile, sourceLine, badUnitNumber} {}
13051306

13061307
bool InquireNoUnitState::Inquire(
13071308
InquiryKeywordHash inquiry, char *result, std::size_t length) {
@@ -1370,8 +1371,10 @@ bool InquireNoUnitState::Inquire(
13701371
bool InquireNoUnitState::Inquire(
13711372
InquiryKeywordHash inquiry, std::int64_t &result) {
13721373
switch (inquiry) {
1373-
case HashInquiryKeyword("NEXTREC"):
13741374
case HashInquiryKeyword("NUMBER"):
1375+
result = badUnitNumber();
1376+
return true;
1377+
case HashInquiryKeyword("NEXTREC"):
13751378
case HashInquiryKeyword("POS"):
13761379
case HashInquiryKeyword("RECL"):
13771380
case HashInquiryKeyword("SIZE"):
@@ -1385,7 +1388,7 @@ bool InquireNoUnitState::Inquire(
13851388

13861389
InquireUnconnectedFileState::InquireUnconnectedFileState(
13871390
OwningPtr<char> &&path, const char *sourceFile, int sourceLine)
1388-
: NoUnitIoStatementState{sourceFile, sourceLine, *this}, path_{std::move(
1391+
: NoUnitIoStatementState{*this, sourceFile, sourceLine}, path_{std::move(
13891392
path)} {}
13901393

13911394
bool InquireUnconnectedFileState::Inquire(
@@ -1491,7 +1494,7 @@ bool InquireUnconnectedFileState::Inquire(
14911494

14921495
InquireIOLengthState::InquireIOLengthState(
14931496
const char *sourceFile, int sourceLine)
1494-
: NoUnitIoStatementState{sourceFile, sourceLine, *this} {}
1497+
: NoUnitIoStatementState{*this, sourceFile, sourceLine} {}
14951498

14961499
bool InquireIOLengthState::Emit(const char *, std::size_t n, std::size_t) {
14971500
bytes_ += n;

flang/runtime/io-stmt.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -588,23 +588,28 @@ class NoUnitIoStatementState : public IoStatementBase {
588588
IoStatementState &ioStatementState() { return ioStatementState_; }
589589
MutableModes &mutableModes() { return connection_.modes; }
590590
ConnectionState &GetConnectionState() { return connection_; }
591+
int badUnitNumber() const { return badUnitNumber_; }
591592
void CompleteOperation();
592593
int EndIoStatement();
593594

594595
protected:
595596
template <typename A>
596-
NoUnitIoStatementState(const char *sourceFile, int sourceLine, A &stmt)
597-
: IoStatementBase{sourceFile, sourceLine}, ioStatementState_{stmt} {}
597+
NoUnitIoStatementState(A &stmt, const char *sourceFile = nullptr,
598+
int sourceLine = 0, int badUnitNumber = -1)
599+
: IoStatementBase{sourceFile, sourceLine}, ioStatementState_{stmt},
600+
badUnitNumber_{badUnitNumber} {}
598601

599602
private:
600603
IoStatementState ioStatementState_; // points to *this
601604
ConnectionState connection_;
605+
int badUnitNumber_;
602606
};
603607

604608
class NoopStatementState : public NoUnitIoStatementState {
605609
public:
606-
NoopStatementState(const char *sourceFile, int sourceLine)
607-
: NoUnitIoStatementState{sourceFile, sourceLine, *this} {}
610+
NoopStatementState(
611+
const char *sourceFile = nullptr, int sourceLine = 0, int unitNumber = -1)
612+
: NoUnitIoStatementState{*this, sourceFile, sourceLine, unitNumber} {}
608613
void set_status(CloseStatus) {} // discards
609614
};
610615

@@ -656,7 +661,8 @@ class InquireUnitState : public ExternalIoStatementBase {
656661

657662
class InquireNoUnitState : public NoUnitIoStatementState {
658663
public:
659-
InquireNoUnitState(const char *sourceFile = nullptr, int sourceLine = 0);
664+
InquireNoUnitState(const char *sourceFile = nullptr, int sourceLine = 0,
665+
int badUnitNumber = -1);
660666
bool Inquire(InquiryKeywordHash, char *, std::size_t);
661667
bool Inquire(InquiryKeywordHash, bool &);
662668
bool Inquire(InquiryKeywordHash, std::int64_t, bool &);

0 commit comments

Comments
 (0)