diff options
| author | Peter Klausler <pklausler@nvidia.com> | 2022-07-01 13:05:58 -0700 |
|---|---|---|
| committer | Peter Klausler <pklausler@nvidia.com> | 2022-07-06 18:55:03 -0700 |
| commit | 7c708adb4a14ef9f181e8107235fb27c53214bc1 (patch) | |
| tree | 9568c79c5794b8cd92f7a48092b6afce4e8d7e99 | |
| parent | ac77649951db17f1126bde08d580ec101f0759bc (diff) | |
| download | llvm-7c708adb4a14ef9f181e8107235fb27c53214bc1.zip llvm-7c708adb4a14ef9f181e8107235fb27c53214bc1.tar.gz llvm-7c708adb4a14ef9f181e8107235fb27c53214bc1.tar.bz2 | |
[flang][runtime] Trim FORMATs echoed to error messages
Since dynamic FORMAT strings usually come from blank-padded fixed-length
CHARACTER variables, trim leading and trailing blanks from them when they
are echoed to error messages for better readability.
Differential Revision: https://reviews.llvm.org/D129024
| -rw-r--r-- | flang/runtime/format.h | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/flang/runtime/format.h b/flang/runtime/format.h index 40a0f30..d0b16bb 100644 --- a/flang/runtime/format.h +++ b/flang/runtime/format.h @@ -150,11 +150,24 @@ private: void ReportBadFormat(Context &context, const char *msg, int offset) const { if constexpr (std::is_same_v<CharType, char>) { - context.SignalError(IostatErrorInFormat, - "%s; at offset %d in format '%s'", msg, offset, format_); - } else { - context.SignalError(IostatErrorInFormat, "%s; at offset %d", msg, offset); + // Echo the bad format in the error message, but trim any leading or + // trailing spaces. + int firstNonBlank{0}; + while (firstNonBlank < formatLength_ && format_[firstNonBlank] == ' ') { + ++firstNonBlank; + } + int lastNonBlank{formatLength_ - 1}; + while (lastNonBlank > firstNonBlank && format_[lastNonBlank] == ' ') { + --lastNonBlank; + } + if (firstNonBlank <= lastNonBlank) { + context.SignalError(IostatErrorInFormat, + "%s; at offset %d in format '%.*s'", msg, offset, + lastNonBlank - firstNonBlank + 1, format_ + firstNonBlank); + return; + } } + context.SignalError(IostatErrorInFormat, "%s; at offset %d", msg, offset); } // Data members are arranged and typed so as to reduce size. |
