Skip to content

Commit 3efa052

Browse files
committed
[Diagnostics] Adjust r-value -> l-value diagnostic to account for ArgumentAttribute
1 parent 3e9e253 commit 3efa052

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

lib/Sema/CSDiagnostics.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,14 @@ bool RValueTreatedAsLValueFailure::diagnoseAsError() {
12391239
if (auto callExpr = dyn_cast<ApplyExpr>(diagExpr)) {
12401240
Expr *argExpr = callExpr->getArg();
12411241
loc = callExpr->getFn()->getLoc();
1242+
auto *locator = getLocator();
1243+
1244+
// `argument attribute` is used for identification purposes
1245+
// only, so it could be looked through in this situation.
1246+
if (locator->isLastElement<LocatorPathElt::ArgumentAttribute>()) {
1247+
auto path = locator->getPath();
1248+
locator = getConstraintLocator(getRawAnchor(), path.drop_back());
1249+
}
12421250

12431251
if (isa<PrefixUnaryExpr>(callExpr) || isa<PostfixUnaryExpr>(callExpr)) {
12441252
subElementDiagID = diag::cannot_apply_lvalue_unop_to_subelement;
@@ -1247,16 +1255,14 @@ bool RValueTreatedAsLValueFailure::diagnoseAsError() {
12471255
} else if (isa<BinaryExpr>(callExpr)) {
12481256
subElementDiagID = diag::cannot_apply_lvalue_binop_to_subelement;
12491257
rvalueDiagID = diag::cannot_apply_lvalue_binop_to_rvalue;
1250-
auto argTuple = dyn_cast<TupleExpr>(argExpr);
1251-
diagExpr = argTuple->getElement(0);
1252-
} else if (getLocator()->getPath().size() > 0) {
1253-
auto argElt =
1254-
getLocator()->castLastElementTo<LocatorPathElt::ApplyArgToParam>();
1255-
1258+
diagExpr = castToExpr(simplifyLocatorToAnchor(locator));
1259+
} else if (auto argElt =
1260+
locator
1261+
->getLastElementAs<LocatorPathElt::ApplyArgToParam>()) {
12561262
subElementDiagID = diag::cannot_pass_rvalue_inout_subelement;
12571263
rvalueDiagID = diag::cannot_pass_rvalue_inout;
12581264
if (auto argTuple = dyn_cast<TupleExpr>(argExpr))
1259-
diagExpr = argTuple->getElement(argElt.getArgIdx());
1265+
diagExpr = argTuple->getElement(argElt->getArgIdx());
12601266
else if (auto parens = dyn_cast<ParenExpr>(argExpr))
12611267
diagExpr = parens->getSubExpr();
12621268
} else {

0 commit comments

Comments
 (0)