aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Parser/openmp-parsers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Parser/openmp-parsers.cpp')
-rw-r--r--flang/lib/Parser/openmp-parsers.cpp17
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)) {