================ @@ -153,6 +153,81 @@ static TypeDeclarationStmt makeIterSpecDecl(std::list<ObjectName> &&names) { makeEntityList(std::move(names))); } +// --- Parsers for context traits ------------------------------------- + +TYPE_PARSER(sourced(construct<OmpTraitPropertyName>( // + (space >> charLiteralConstantWithoutKind) || + applyMem(&Name::ToString, Parser<Name>{})))) + +TYPE_PARSER(sourced(construct<OmpTraitScore>( // + "SCORE" >> parenthesized(scalarIntExpr)))) + +TYPE_PARSER(sourced(construct<OmpTraitPropertyExtension::ExtensionValue>( + // Parse nested extension first. + construct<OmpTraitPropertyExtension::ExtensionValue>( + indirect(Parser<OmpTraitPropertyExtension>{})) || + construct<OmpTraitPropertyExtension::ExtensionValue>( + Parser<OmpTraitPropertyName>{}) || + construct<OmpTraitPropertyExtension::ExtensionValue>(scalarExpr)))) + +TYPE_PARSER(sourced(construct<OmpTraitPropertyExtension>( // + Parser<OmpTraitPropertyName>{}, + parenthesized(nonemptySeparated( + Parser<OmpTraitPropertyExtension::ExtensionValue>{}, ","_tok))))) + +TYPE_PARSER(sourced(construct<OmpTraitProperty>( + // Try clause first, then extension before OmpTraitPropertyName. + construct<OmpTraitProperty>(indirect(Parser<OmpClause>{})) || + construct<OmpTraitProperty>(Parser<OmpTraitPropertyExtension>{}) || + construct<OmpTraitProperty>(Parser<OmpTraitPropertyName>{}) || + construct<OmpTraitProperty>(scalarExpr)))) + +TYPE_PARSER(construct<OmpTraitSelectorName::Value>( + "ARCH" >> pure(OmpTraitSelectorName::Value::Arch) || + "ATOMIC_DEFAULT_MEM_ORDER" >> + pure(OmpTraitSelectorName::Value::Atomic_Default_Mem_Order) || + "CONDITION" >> pure(OmpTraitSelectorName::Value::Condition) || + "DEVICE_NUM" >> pure(OmpTraitSelectorName::Value::Device_Num) || + "EXTENSION" >> pure(OmpTraitSelectorName::Value::Extension) || + "ISA" >> pure(OmpTraitSelectorName::Value::Isa) || + "KIND" >> pure(OmpTraitSelectorName::Value::Kind) || + "REQUIRES" >> pure(OmpTraitSelectorName::Value::Requires) || + "SIMD" >> pure(OmpTraitSelectorName::Value::Simd) || + "UID" >> pure(OmpTraitSelectorName::Value::Uid) || + "VENDOR" >> pure(OmpTraitSelectorName::Value::Vendor))) + +TYPE_PARSER(sourced(construct<OmpTraitSelectorName>( + // Parse predefined names first (because of SIMD). + construct<OmpTraitSelectorName>(Parser<OmpTraitSelectorName::Value>{}) || + construct<OmpTraitSelectorName>(OmpDirectiveNameParser{})))) + +TYPE_PARSER(construct<OmpTraitSelector::Properties>( + maybe(Parser<OmpTraitScore>{} / ":"_tok), + nonemptySeparated(Parser<OmpTraitProperty>{}, ","_tok))) + +TYPE_PARSER(sourced(construct<OmpTraitSelector>( // + Parser<OmpTraitSelectorName>{}, // + maybe(parenthesized(Parser<OmpTraitSelector::Properties>{}))))) + +TYPE_PARSER(construct<OmpTraitSetSelectorName::Value>( + "CONSTRUCT" >> pure(OmpTraitSetSelectorName::Value::Construct) || + "DEVICE" >> pure(OmpTraitSetSelectorName::Value::Device) || + "IMPLEMENTATION" >> pure(OmpTraitSetSelectorName::Value::Implementation) || + "TARGET_DEVICE" >> pure(OmpTraitSetSelectorName::Value::Target_Device) || + "USER" >> pure(OmpTraitSetSelectorName::Value::User))) + +TYPE_PARSER(sourced(construct<OmpTraitSetSelectorName>( + Parser<OmpTraitSetSelectorName::Value>{}))) + +TYPE_PARSER(sourced(construct<OmpTraitSetSelector>( // + Parser<OmpTraitSetSelectorName>{}, + "=" >> braced(nonemptySeparated(Parser<OmpTraitSelector>{}, ","_tok))))) + +TYPE_PARSER(sourced(construct<OmpContextSelectorSpecification>( + nonemptySeparated(Parser<OmpTraitSetSelector>{}, ","_tok)))) + +// Parser<OmpContextSelector> == Parser<traits::OmpContextSelectorSpecification> ---------------- kparzysz wrote:
This is a section with parsers for all modifiers. You'd expect to find the parser for OmpContextSelector here as well, but it's the same as the parser for the OmpContextSelectorSpecification. To avoid confusion why it's not here, I added a comment that's intended to explain it. https://github.com/llvm/llvm-project/pull/121815 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits