aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Parser/token-sequence.cpp
diff options
context:
space:
mode:
authorpeter klausler <pklausler@nvidia.com>2020-07-17 11:21:08 -0700
committerpeter klausler <pklausler@nvidia.com>2020-07-17 15:28:22 -0700
commitcf2274b779f5ffee476cfe40994e6963a51c6428 (patch)
treefffe66c39d4d340713f80c04ec8c78e201f89dad /flang/lib/Parser/token-sequence.cpp
parent86fb2db49b33aa4759d351b30ea1f6ebbe252c60 (diff)
downloadllvm-cf2274b779f5ffee476cfe40994e6963a51c6428.zip
llvm-cf2274b779f5ffee476cfe40994e6963a51c6428.tar.gz
llvm-cf2274b779f5ffee476cfe40994e6963a51c6428.tar.bz2
[flang] Allow ! and // comments after some preprocessing directives
Old-style C /*comments*/ are omitted from preprocessor directive token sequences by the prescanner, but line-ending C++ and Fortran free-form comments are not since their handling might depend on the directive. Add code to skip these line-ending comments as appropriate in place of existing code that just skipped blanks. Reviewed By: sscalpone Differential Revision: https://reviews.llvm.org/D84061
Diffstat (limited to 'flang/lib/Parser/token-sequence.cpp')
-rw-r--r--flang/lib/Parser/token-sequence.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/flang/lib/Parser/token-sequence.cpp b/flang/lib/Parser/token-sequence.cpp
index ce94f26..07c5b12 100644
--- a/flang/lib/Parser/token-sequence.cpp
+++ b/flang/lib/Parser/token-sequence.cpp
@@ -56,6 +56,31 @@ std::size_t TokenSequence::SkipBlanks(std::size_t at) const {
return tokens; // even if at > tokens
}
+// C-style /*comments*/ are removed from preprocessing directive
+// token sequences by the prescanner, but not C++ or Fortran
+// free-form line-ending comments (//... and !...) because
+// ignoring them is directive-specific.
+bool TokenSequence::IsAnythingLeft(std::size_t at) const {
+ std::size_t tokens{start_.size()};
+ for (; at < tokens; ++at) {
+ auto tok{TokenAt(at)};
+ const char *end{tok.end()};
+ for (const char *p{tok.begin()}; p < end; ++p) {
+ switch (*p) {
+ case '/':
+ return p + 1 >= end || p[1] != '/';
+ case '!':
+ return false;
+ case ' ':
+ break;
+ default:
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
void TokenSequence::RemoveLastToken() {
CHECK(!start_.empty());
CHECK(nextStart_ > start_.back());