================ @@ -16,13 +16,58 @@ #include "token-parsers.h" #include "type-parser-implementation.h" #include "flang/Parser/parse-tree.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Frontend/OpenMP/OMP.h" // OpenMP Directives and Clauses namespace Fortran::parser { constexpr auto startOmpLine = skipStuffBeforeStatement >> "!$OMP "_sptok; constexpr auto endOmpLine = space >> endOfLine; +/// Parse OpenMP directive name (this includes compound directives). +struct OmpDirectiveNameParser { + using resultType = llvm::omp::Directive; + using Token = TokenStringMatch<false, false>; + + std::optional<resultType> Parse(ParseState &state) const { + for (const NameWithId &nid : directives()) { + if (attempt(Token(nid.first.data())).Parse(state)) { + return nid.second; + } + } + return std::nullopt; + } + +private: + using NameWithId = std::pair<std::string, llvm::omp::Directive>; + + llvm::iterator_range<const NameWithId *> directives() const; + void initTokens(NameWithId *) const; +}; + +llvm::iterator_range<const OmpDirectiveNameParser::NameWithId *> +OmpDirectiveNameParser::directives() const { + static NameWithId table[llvm::omp::Directive_enumSize]; + [[maybe_unused]] static bool init = (initTokens(table), true); ---------------- tblah wrote:
If I understand correctly, this is a trick to run `initTokens` along with static variable initializers. This is quite clever but I had to stare at it for a while to understand what was going on. I would prefer something very simple like, but I will leave this up to you - maybe this is a widely understood idiom I am just unfamiliar with. ```c++ static bool init{false}; if (!init) { init_tokens(table); init = true; } ``` This isn't semantically identical but I don't think running initTokens a bit later should matter. https://github.com/llvm/llvm-project/pull/118128 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits