diff options
Diffstat (limited to 'flang/lib/Parser/token-sequence.cpp')
| -rw-r--r-- | flang/lib/Parser/token-sequence.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/flang/lib/Parser/token-sequence.cpp b/flang/lib/Parser/token-sequence.cpp index d0254ecd5aae..133e60ba4f00 100644 --- a/flang/lib/Parser/token-sequence.cpp +++ b/flang/lib/Parser/token-sequence.cpp @@ -347,7 +347,8 @@ ProvenanceRange TokenSequence::GetProvenanceRange() const { } const TokenSequence &TokenSequence::CheckBadFortranCharacters( - Messages &messages, const Prescanner &prescanner) const { + Messages &messages, const Prescanner &prescanner, + bool allowAmpersand) const { std::size_t tokens{SizeInTokens()}; for (std::size_t j{0}; j < tokens; ++j) { CharBlock token{TokenAt(j)}; @@ -362,6 +363,8 @@ const TokenSequence &TokenSequence::CheckBadFortranCharacters( ++j; continue; } + } else if (ch == '&' && allowAmpersand) { + continue; } if (ch < ' ' || ch >= '\x7f') { messages.Say(GetTokenProvenanceRange(j), @@ -375,9 +378,7 @@ const TokenSequence &TokenSequence::CheckBadFortranCharacters( return *this; } -const TokenSequence &TokenSequence::CheckBadParentheses( - Messages &messages) const { - // First, a quick pass with no allocation for the common case +bool TokenSequence::BadlyNestedParentheses() const { int nesting{0}; std::size_t tokens{SizeInTokens()}; for (std::size_t j{0}; j < tokens; ++j) { @@ -391,8 +392,14 @@ const TokenSequence &TokenSequence::CheckBadParentheses( } } } - if (nesting != 0) { + return nesting != 0; +} + +const TokenSequence &TokenSequence::CheckBadParentheses( + Messages &messages) const { + if (BadlyNestedParentheses()) { // There's an error; diagnose it + std::size_t tokens{SizeInTokens()}; std::vector<std::size_t> stack; for (std::size_t j{0}; j < tokens; ++j) { CharBlock token{TokenAt(j)}; |
