[flang-commits] [flang] b2cf572 - [flang] Respect BZ mode in exponent parts, too
peter klausler via flang-commits
flang-commits at lists.llvm.org
Mon Sep 14 17:03:43 PDT 2020
Author: peter klausler
Date: 2020-09-14T17:03:21-07:00
New Revision: b2cf572b562048f54b774d9cef88cf792a33ab31
URL: https://github.com/llvm/llvm-project/commit/b2cf572b562048f54b774d9cef88cf792a33ab31
DIFF: https://github.com/llvm/llvm-project/commit/b2cf572b562048f54b774d9cef88cf792a33ab31.diff
LOG: [flang] Respect BZ mode in exponent parts, too
The Fortran standard discusses BZ mode (treat blanks as zero digits)
explicitly in its effect on the editing of the digits prior to the
exponent part, but doesn't mention it in description of the
exponent part. Other compilers honor BZ mode in the exponent,
so we should do so too. So "1 e 1 " is 1.E11 in BZ mode.
Differential Revision: https://reviews.llvm.org/D87653
Added:
Modified:
flang/runtime/edit-input.cpp
flang/unittests/Runtime/hello.cpp
Removed:
################################################################################
diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp
index 998edc954ba7..da281aa68e43 100644
--- a/flang/runtime/edit-input.cpp
+++ b/flang/runtime/edit-input.cpp
@@ -180,10 +180,11 @@ static int ScanRealInput(char *buffer, int bufferSize, IoStatementState &io,
first == 'E' || first == 'D' || first == 'Q') {
Put('.'); // input field is normalized to a fraction
auto start{got};
+ bool bzMode{(edit.modes.editingFlags & blankZero) != 0};
for (; next; next = io.NextInField(remaining)) {
char32_t ch{*next};
if (ch == ' ' || ch == '\t') {
- if (edit.modes.editingFlags & blankZero) {
+ if (bzMode) {
ch = '0'; // BZ mode - treat blank as if it were zero
} else {
continue;
@@ -206,19 +207,29 @@ static int ScanRealInput(char *buffer, int bufferSize, IoStatementState &io,
if (next &&
(*next == 'e' || *next == 'E' || *next == 'd' || *next == 'D' ||
*next == 'q' || *next == 'Q')) {
+ // Optional exponent letter. Blanks are allowed between the
+ // optional exponent letter and the exponent value.
io.SkipSpaces(remaining);
next = io.NextInField(remaining);
}
- exponent = -edit.modes.scale; // default exponent is -kP
+ // The default exponent is -kP, but the scale factor doesn't affect
+ // an explicit exponent.
+ exponent = -edit.modes.scale;
if (next &&
- (*next == '-' || *next == '+' || (*next >= '0' && *next <= '9'))) {
+ (*next == '-' || *next == '+' || (*next >= '0' && *next <= '9') ||
+ (bzMode && (*next == ' ' || *next == '\t')))) {
bool negExpo{*next == '-'};
if (negExpo || *next == '+') {
next = io.NextInField(remaining);
}
- for (exponent = 0; next && (*next >= '0' && *next <= '9');
- next = io.NextInField(remaining)) {
- exponent = 10 * exponent + *next - '0';
+ for (exponent = 0; next; next = io.NextInField(remaining)) {
+ if (*next >= '0' && *next <= '9') {
+ exponent = 10 * exponent + *next - '0';
+ } else if (bzMode && (*next == ' ' || *next == '\t')) {
+ exponent = 10 * exponent;
+ } else {
+ break;
+ }
}
if (negExpo) {
exponent = -exponent;
diff --git a/flang/unittests/Runtime/hello.cpp b/flang/unittests/Runtime/hello.cpp
index c38aedf4f654..c1daccae383a 100644
--- a/flang/unittests/Runtime/hello.cpp
+++ b/flang/unittests/Runtime/hello.cpp
@@ -481,6 +481,7 @@ int main() {
realInTest("(-1P,F18.0)", " 125", 0x4093880000000000); // 1250
realInTest("(1P,F18.0)", " 125", 0x4029000000000000); // 12.5
realInTest("(BZ,F18.0)", " 125 ", 0x4093880000000000); // 1250
+ realInTest("(BZ,F18.0)", " 125 . e +1 ", 0x42a6bcc41e900000); // 1.25e13
realInTest("(DC,F18.0)", " 12,5", 0x4029000000000000);
listInputTest();
More information about the flang-commits
mailing list