diff options
author | peter klausler <pklausler@nvidia.com> | 2020-07-14 10:16:30 -0700 |
---|---|---|
committer | peter klausler <pklausler@nvidia.com> | 2020-07-14 14:14:35 -0700 |
commit | af6b8d51390dc1a4af7ae5de4e71947dce8a75f6 (patch) | |
tree | 27d98ce9fd13bcddbdfce71248c3607fb8654942 /flang/lib/Parser/source.cpp | |
parent | c1e2f73c392c111dc40de09daa71245f640ca9f5 (diff) | |
download | llvm-af6b8d51390dc1a4af7ae5de4e71947dce8a75f6.zip llvm-af6b8d51390dc1a4af7ae5de4e71947dce8a75f6.tar.gz llvm-af6b8d51390dc1a4af7ae5de4e71947dce8a75f6.tar.bz2 |
[flang] Refine CR handling
We need to retain carriage return characters in source files
that are not parts of multi-byte line endings; they are
significant in CHARACTER literal constants.
Reviewed By: tskeith
Differential Revision: https://reviews.llvm.org/D83808
Diffstat (limited to 'flang/lib/Parser/source.cpp')
-rw-r--r-- | flang/lib/Parser/source.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/flang/lib/Parser/source.cpp b/flang/lib/Parser/source.cpp index 4f6c21f..693138c 100644 --- a/flang/lib/Parser/source.cpp +++ b/flang/lib/Parser/source.cpp @@ -85,10 +85,19 @@ std::size_t RemoveCarriageReturns(llvm::MutableArrayRef<char> buf) { break; } std::size_t chunk = crcp - p; + auto advance{chunk + 1}; + if (chunk + 1 >= bytes || crcp[1] == '\n') { + // CR followed by LF or EOF: omit + } else if ((chunk == 0 && p == buf.data()) || crcp[-1] == '\n') { + // CR preceded by LF or BOF: omit + } else { + // CR in line: retain + ++chunk; + } std::memmove(buffer + wrote, p, chunk); wrote += chunk; - p += chunk + 1; - bytes -= chunk + 1; + p += advance; + bytes -= advance; } return wrote; } |