aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Parser/source.cpp
diff options
context:
space:
mode:
authorpeter klausler <pklausler@nvidia.com>2020-07-14 10:16:30 -0700
committerpeter klausler <pklausler@nvidia.com>2020-07-14 14:14:35 -0700
commitaf6b8d51390dc1a4af7ae5de4e71947dce8a75f6 (patch)
tree27d98ce9fd13bcddbdfce71248c3607fb8654942 /flang/lib/Parser/source.cpp
parentc1e2f73c392c111dc40de09daa71245f640ca9f5 (diff)
downloadllvm-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.cpp13
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;
}