aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Parser/preprocessor.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/preprocessor.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/preprocessor.cpp')
-rw-r--r--flang/lib/Parser/preprocessor.cpp16
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);