@@ -888,7 +888,18 @@ void Parser::parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty,
888888 TIProperty.Kind = TraitProperty::invalid;
889889
890890 SourceLocation NameLoc = Tok.getLocation ();
891- StringRef Name = getNameFromIdOrString (*this , Tok, CONTEXT_TRAIT_LVL);
891+ StringRef Name;
892+ if (Selector == llvm::omp::TraitSelector::target_device_device_num) {
893+ Name = " number" ;
894+ TIProperty.Kind = getOpenMPContextTraitPropertyKind (Set, Selector, Name);
895+ ExprResult DeviceNumExprResult = ParseExpression ();
896+ if (DeviceNumExprResult.isUsable ()) {
897+ Expr *DeviceNumExpr = DeviceNumExprResult.get ();
898+ Actions.OpenMP ().ActOnOpenMPDeviceNum (DeviceNumExpr);
899+ }
900+ return ;
901+ }
902+ Name = getNameFromIdOrString (*this , Tok, CONTEXT_TRAIT_LVL);
892903 if (Name.empty ()) {
893904 Diag (Tok.getLocation (), diag::note_omp_declare_variant_ctx_options)
894905 << CONTEXT_TRAIT_LVL << listOpenMPContextTraitProperties (Set, Selector);
@@ -918,7 +929,8 @@ void Parser::parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty,
918929 << " (<property-name>)" ;
919930 return ;
920931 }
921- TraitSelector SelectorForName = getOpenMPContextTraitSelectorKind (Name);
932+ TraitSelector SelectorForName =
933+ getOpenMPContextTraitSelectorKind (Name, SetForName);
922934 if (SelectorForName != TraitSelector::invalid) {
923935 Diag (NameLoc, diag::note_omp_declare_variant_ctx_is_a)
924936 << Name << CONTEXT_SELECTOR_LVL << CONTEXT_TRAIT_LVL;
@@ -935,7 +947,7 @@ void Parser::parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty,
935947 }
936948 for (const auto &PotentialSet :
937949 {TraitSet::construct, TraitSet::user, TraitSet::implementation,
938- TraitSet::device}) {
950+ TraitSet::device, TraitSet::target_device }) {
939951 TraitProperty PropertyForName =
940952 getOpenMPContextTraitPropertyKind (PotentialSet, Selector, Name);
941953 if (PropertyForName == TraitProperty::invalid)
@@ -1062,7 +1074,7 @@ void Parser::parseOMPTraitSelectorKind(OMPTraitSelector &TISelector,
10621074 return ;
10631075 }
10641076
1065- TISelector.Kind = getOpenMPContextTraitSelectorKind (Name);
1077+ TISelector.Kind = getOpenMPContextTraitSelectorKind (Name, Set );
10661078 if (TISelector.Kind != TraitSelector::invalid) {
10671079 if (checkForDuplicates (*this , Name, NameLoc, Seen, CONTEXT_SELECTOR_LVL))
10681080 TISelector.Kind = TraitSelector::invalid;
@@ -1084,7 +1096,7 @@ void Parser::parseOMPTraitSelectorKind(OMPTraitSelector &TISelector,
10841096 }
10851097 for (const auto &PotentialSet :
10861098 {TraitSet::construct, TraitSet::user, TraitSet::implementation,
1087- TraitSet::device}) {
1099+ TraitSet::device, TraitSet::target_device }) {
10881100 TraitProperty PropertyForName = getOpenMPContextTraitPropertyKind (
10891101 PotentialSet, TraitSelector::invalid, Name);
10901102 if (PropertyForName == TraitProperty::invalid)
@@ -1259,7 +1271,8 @@ void Parser::parseOMPTraitSetKind(OMPTraitSet &TISet,
12591271 // It follows diagnosis and helping notes.
12601272 Diag (NameLoc, diag::warn_omp_declare_variant_ctx_not_a_set) << Name;
12611273
1262- TraitSelector SelectorForName = getOpenMPContextTraitSelectorKind (Name);
1274+ TraitSelector SelectorForName =
1275+ getOpenMPContextTraitSelectorKind (Name, TISet.Kind );
12631276 if (SelectorForName != TraitSelector::invalid) {
12641277 Diag (NameLoc, diag::note_omp_declare_variant_ctx_is_a)
12651278 << Name << CONTEXT_SELECTOR_LVL << CONTEXT_SELECTOR_SET_LVL;
@@ -1276,7 +1289,7 @@ void Parser::parseOMPTraitSetKind(OMPTraitSet &TISet,
12761289 }
12771290 for (const auto &PotentialSet :
12781291 {TraitSet::construct, TraitSet::user, TraitSet::implementation,
1279- TraitSet::device}) {
1292+ TraitSet::device, TraitSet::target_device }) {
12801293 TraitProperty PropertyForName = getOpenMPContextTraitPropertyKind (
12811294 PotentialSet, TraitSelector::invalid, Name);
12821295 if (PropertyForName == TraitProperty::invalid)
@@ -2253,7 +2266,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
22532266 TargetOMPContext OMPCtx (
22542267 ASTCtx, std::move (DiagUnknownTrait),
22552268 /* CurrentFunctionDecl */ nullptr ,
2256- /* ConstructTraits */ ArrayRef<llvm::omp::TraitProperty>());
2269+ /* ConstructTraits */ ArrayRef<llvm::omp::TraitProperty>(),
2270+ Actions.OpenMP ().getOpenMPDeviceNum ());
22572271
22582272 if (isVariantApplicableInContext (VMI, OMPCtx, /* DeviceSetOnly */ true )) {
22592273 Actions.OpenMP ().ActOnOpenMPBeginDeclareVariant (Loc, TI);
@@ -2805,7 +2819,8 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
28052819 };
28062820 TargetOMPContext OMPCtx (ASTContext, std::move (DiagUnknownTrait),
28072821 /* CurrentFunctionDecl */ nullptr ,
2808- ArrayRef<llvm::omp::TraitProperty>());
2822+ ArrayRef<llvm::omp::TraitProperty>(),
2823+ Actions.OpenMP ().getOpenMPDeviceNum ());
28092824
28102825 // A single match is returned for OpenMP 5.0
28112826 int BestIdx = getBestVariantMatchForContext (VMIs, OMPCtx);
0 commit comments