diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index 8a18bcc9e4485..1957c7c5947cd 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -290,10 +290,27 @@ static bool IsReservedName(const Name &name) { TYPE_PARSER( // construct(predicated(name, IsReservedName))) -// Parse x(...)(...) as a substring instead of a function reference. -TYPE_PARSER( // - construct(functionReference / !lookAhead("("_tok)) || - construct(Parser{})) +struct LocatorParser { + using resultType = OmpLocator; + using Token = TokenStringMatch; + + std::optional Parse(ParseState &state) const { + // Parse x(...)(...) as a substring instead of a function reference. + auto funcRef{functionReference / !lookAhead("("_tok)}; + if (auto &&result{attempt(funcRef).Parse(state)}) { + return std::move(*result); + } + for (llvm::StringRef n : llvm::omp::getReservedLocatorNames()) { + auto match{Token(n.data(), n.size())}; + if (auto &&result{attempt(match >= name).Parse(state)}) { + return OmpReservedIdentifier(std::move(*result)); + } + } + return std::nullopt; + } +}; + +TYPE_PARSER(construct(LocatorParser{})) TYPE_PARSER( // construct(Parser{}) || diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 74ea19602d975..faced12ae92ac 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -649,16 +649,6 @@ bool OmpStructureChecker::HasRequires(llvm::omp::Clause req) { DEREF(unit.symbol()).details()); } -void OmpStructureChecker::Enter(const parser::OmpLocator &x) { - if (auto *reserved{parser::Unwrap(x.u)}) { - std::string name{parser::ToLowerCaseLetters(reserved->v.source.ToString())}; - if (!llvm::is_contained(llvm::omp::getReservedLocatorNames(), name)) { - context_.Say(reserved->v.source, "'%s' is not a valid locator"_err_en_US, - parser::ToUpperCaseLetters(name)); - } - } -} - void OmpStructureChecker::CheckArgumentObjectKind(const parser::OmpClause &x) { unsigned version{context_.langOptions().OpenMPVersion}; llvm::omp::Directive dirId{GetContext().directive}; @@ -3229,6 +3219,11 @@ void OmpStructureChecker::Enter(const parser::OpenMPCriticalConstruct &x) { if (auto *object{parser::Unwrap(arg.u)}) { if (auto *designator{GetDesignatorFromObj(*object)}) { return parser::GetDesignatorNameIfDataRef(*designator); + } else if (auto *locator{std::get_if(&object->u)}) { + if (auto *res{ + std::get_if(&locator->u)}) { + return &res->v; + } } } return static_cast(nullptr); diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h index f275717135874..011b29d370ba3 100644 --- a/flang/lib/Semantics/check-omp-structure.h +++ b/flang/lib/Semantics/check-omp-structure.h @@ -128,7 +128,6 @@ class OmpStructureChecker : public OmpStructureCheckerBase { void Enter(const parser::OpenMPCriticalConstruct &); void Enter(const parser::OpenMPAtomicConstruct &); - void Enter(const parser::OmpLocator &x); void Enter(const parser::OmpClauseList &); void Leave(const parser::OmpClauseList &); void Enter(const parser::OmpClause &); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index c3286035c8641..f497cd50f9c42 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -2186,29 +2186,39 @@ void OmpVisitor::ProcessReductionSpecifier( } void OmpVisitor::ResolveCriticalName(const parser::OmpArgument &arg) { - auto &globalScope{[&]() -> Scope & { - for (Scope *s{&currScope()};; s = &s->parent()) { - if (s->IsTopLevel()) { - return *s; - } - } - llvm_unreachable("Cannot find global scope"); - }()}; + auto *object{parser::Unwrap(arg.u)}; + if (!object) { + return; + } - if (auto *object{parser::Unwrap(arg.u)}) { - if (auto *desg{parser::omp::GetDesignatorFromObj(*object)}) { - if (auto *name{parser::GetDesignatorNameIfDataRef(*desg)}) { - if (auto *symbol{FindInScope(globalScope, *name)}) { - if (!symbol->test(Symbol::Flag::OmpCriticalLock)) { - SayWithDecl(*name, *symbol, - "CRITICAL construct name '%s' conflicts with a previous declaration"_warn_en_US, - name->ToString()); - } - } else { - name->symbol = &MakeSymbol(globalScope, name->source, Attrs{}); - name->symbol->set(Symbol::Flag::OmpCriticalLock); - } + const parser::Name *name{common::visit( // + common::visitors{// + [&](const parser::Designator &x) -> const parser::Name * { + return parser::GetDesignatorNameIfDataRef(x); + }, + [&](const parser::OmpLocator &x) -> const parser::Name * { + if (auto *res{std::get_if(&x.u)}) { + return &res->v; + } + return nullptr; + }, + [&](const parser::Name &) -> const parser::Name * { return nullptr; }, + [&](const parser::OmpObject::Invalid &) -> const parser::Name * { + return nullptr; + }}, + object->u)}; + + if (name) { + if (auto *symbol{FindInScope(context().globalScope(), *name)}) { + if (!symbol->test(Symbol::Flag::OmpCriticalLock)) { + SayWithDecl(*name, *symbol, + "CRITICAL construct name '%s' conflicts with a previous declaration"_warn_en_US, + name->ToString()); } + } else { + name->symbol = + &MakeSymbol(context().globalScope(), name->source, Attrs{}); + name->symbol->set(Symbol::Flag::OmpCriticalLock); } } } diff --git a/flang/test/Semantics/OpenMP/reserved-locator.f90 b/flang/test/Semantics/OpenMP/reserved-locator.f90 deleted file mode 100644 index 3fc45ffa0f54c..0000000000000 --- a/flang/test/Semantics/OpenMP/reserved-locator.f90 +++ /dev/null @@ -1,6 +0,0 @@ -!RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp -fopenmp-version=60 - -subroutine f -!ERROR: 'OMP_SOME_MEMORY' is not a valid locator - !$omp target update from(omp_some_memory) -end