diff options
author | peter klausler <pklausler@nvidia.com> | 2020-07-17 11:21:08 -0700 |
---|---|---|
committer | peter klausler <pklausler@nvidia.com> | 2020-07-17 15:28:22 -0700 |
commit | cf2274b779f5ffee476cfe40994e6963a51c6428 (patch) | |
tree | fffe66c39d4d340713f80c04ec8c78e201f89dad /flang/lib/Parser/preprocessor.cpp | |
parent | 86fb2db49b33aa4759d351b30ea1f6ebbe252c60 (diff) | |
download | llvm-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/preprocessor.cpp')
-rw-r--r-- | flang/lib/Parser/preprocessor.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/flang/lib/Parser/preprocessor.cpp b/flang/lib/Parser/preprocessor.cpp index 3b09597..a1f0796 100644 --- a/flang/lib/Parser/preprocessor.cpp +++ b/flang/lib/Parser/preprocessor.cpp @@ -453,10 +453,9 @@ void Preprocessor::Directive(const TokenSequence &dir, Prescanner *prescanner) { dir.GetIntervalProvenanceRange(dirOffset, tokens - dirOffset), "# missing or invalid name"_err_en_US); } else { - j = dir.SkipBlanks(j + 1); - if (j != tokens) { + if (dir.IsAnythingLeft(++j)) { prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j), - "#undef: excess tokens at end of directive"_err_en_US); + "#undef: excess tokens at end of directive"_en_US); } else { definitions_.erase(nameToken); } @@ -468,8 +467,7 @@ void Preprocessor::Directive(const TokenSequence &dir, Prescanner *prescanner) { dir.GetIntervalProvenanceRange(dirOffset, tokens - dirOffset), "#%s: missing name"_err_en_US, dirName); } else { - j = dir.SkipBlanks(j + 1); - if (j != tokens) { + if (dir.IsAnythingLeft(++j)) { prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j), "#%s: excess tokens at end of directive"_en_US, dirName); } @@ -489,9 +487,9 @@ void Preprocessor::Directive(const TokenSequence &dir, Prescanner *prescanner) { dir.GetTokenProvenanceRange(dirOffset)); } } else if (dirName == "else") { - if (j != tokens) { + if (dir.IsAnythingLeft(j)) { prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j), - "#else: excess tokens at end of directive"_err_en_US); + "#else: excess tokens at end of directive"_en_US); } else if (ifStack_.empty()) { prescanner->Say(dir.GetTokenProvenanceRange(dirOffset), "#else: not nested within #if, #ifdef, or #ifndef"_err_en_US); @@ -516,9 +514,9 @@ void Preprocessor::Directive(const TokenSequence &dir, Prescanner *prescanner) { dir.GetTokenProvenanceRange(dirOffset)); } } else if (dirName == "endif") { - if (j != tokens) { + if (dir.IsAnythingLeft(j)) { prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j), - "#endif: excess tokens at end of directive"_err_en_US); + "#endif: excess tokens at end of directive"_en_US); } else if (ifStack_.empty()) { prescanner->Say(dir.GetTokenProvenanceRange(dirOffset), "#endif: no #if, #ifdef, or #ifndef"_err_en_US); |