Skip to content

Commit 34782b7

Browse files
committed
Parse scoped lifetime dependence kind within the @Lifetime attribute
1 parent 5d5627a commit 34782b7

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

lib/AST/LifetimeDependence.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ getLifetimeDependenceKind(LifetimeEntry specifier, AbstractFunctionDecl *afd,
230230
loc, diag::lifetime_dependence_cannot_use_inferred_scoped_consuming);
231231
return std::nullopt;
232232
}
233+
return lifetimeKind;
233234
}
234235

235236
// For dependsOn type modifier, we check if we had a "scoped" modifier, if not

lib/Parse/ParseDecl.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,6 +2819,15 @@ ParserResult<LifetimeAttr> Parser::parseLifetimeAttribute(SourceLoc atLoc,
28192819
diag::expected_rparen_after_lifetime_dependence, [&]() -> ParserStatus {
28202820
ParserStatus listStatus;
28212821
foundParamId = true;
2822+
2823+
auto lifetimeDependenceKind = ParsedLifetimeDependenceKind::Default;
2824+
if (Tok.isContextualKeyword("borrow") &&
2825+
peekToken().isAny(tok::identifier, tok::integer_literal,
2826+
tok::kw_self)) {
2827+
lifetimeDependenceKind = ParsedLifetimeDependenceKind::Scope;
2828+
consumeToken();
2829+
}
2830+
28222831
switch (Tok.getKind()) {
28232832
case tok::identifier: {
28242833
Identifier paramName;
@@ -2828,8 +2837,8 @@ ParserResult<LifetimeAttr> Parser::parseLifetimeAttribute(SourceLoc atLoc,
28282837
lifetimeEntries.push_back(
28292838
LifetimeEntry::getImmortalLifetimeEntry(paramLoc));
28302839
} else {
2831-
lifetimeEntries.push_back(
2832-
LifetimeEntry::getNamedLifetimeEntry(paramLoc, paramName));
2840+
lifetimeEntries.push_back(LifetimeEntry::getNamedLifetimeEntry(
2841+
paramLoc, paramName, lifetimeDependenceKind));
28332842
}
28342843
break;
28352844
}
@@ -2842,14 +2851,14 @@ ParserResult<LifetimeAttr> Parser::parseLifetimeAttribute(SourceLoc atLoc,
28422851
listStatus.setIsParseError();
28432852
return listStatus;
28442853
}
2845-
lifetimeEntries.push_back(
2846-
LifetimeEntry::getOrderedLifetimeEntry(paramLoc, paramNum));
2854+
lifetimeEntries.push_back(LifetimeEntry::getOrderedLifetimeEntry(
2855+
paramLoc, paramNum, lifetimeDependenceKind));
28472856
break;
28482857
}
28492858
case tok::kw_self: {
28502859
auto paramLoc = consumeToken(tok::kw_self);
2851-
lifetimeEntries.push_back(
2852-
LifetimeEntry::getSelfLifetimeEntry(paramLoc));
2860+
lifetimeEntries.push_back(LifetimeEntry::getSelfLifetimeEntry(
2861+
paramLoc, lifetimeDependenceKind));
28532862
break;
28542863
}
28552864
default:

0 commit comments

Comments
 (0)