diff options
Diffstat (limited to 'flang/lib/Parser')
-rw-r--r-- | flang/lib/Parser/openmp-parsers.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index 25a692d..1c62614 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -1222,11 +1222,14 @@ struct StrictlyStructuredBlockParser { using resultType = Block; std::optional<resultType> Parse(ParseState &state) const { - if (auto epc{Parser<ExecutionPartConstruct>{}.Parse(state)}) { - if (IsFortranBlockConstruct(*epc)) { - Block block; - block.emplace_back(std::move(*epc)); - return std::move(block); + // Detect BLOCK construct without parsing the entire thing. + if (lookAhead(skipStuffBeforeStatement >> "BLOCK"_tok).Parse(state)) { + if (auto epc{Parser<ExecutionPartConstruct>{}.Parse(state)}) { + if (IsFortranBlockConstruct(*epc)) { + Block block; + block.emplace_back(std::move(*epc)); + return std::move(block); + } } } return std::nullopt; @@ -1237,6 +1240,10 @@ struct LooselyStructuredBlockParser { using resultType = Block; std::optional<resultType> Parse(ParseState &state) const { + // Detect BLOCK construct without parsing the entire thing. + if (lookAhead(skipStuffBeforeStatement >> "BLOCK"_tok).Parse(state)) { + return std::nullopt; + } Block body; if (auto epc{attempt(Parser<ExecutionPartConstruct>{}).Parse(state)}) { if (!IsFortranBlockConstruct(*epc)) { |