@@ -3690,7 +3690,9 @@ static ConcreteDeclRef
3690
3690
resolveLocatorToDecl (ConstraintSystem &cs, ConstraintLocator *locator,
3691
3691
std::function<Optional<SelectedOverload>(ConstraintLocator *)> findOvlChoice,
3692
3692
std::function<ConcreteDeclRef (ValueDecl *decl,
3693
- Type openedType)> getConcreteDeclRef)
3693
+ Type openedType,
3694
+ ConstraintLocator *declLocator)>
3695
+ getConcreteDeclRef)
3694
3696
{
3695
3697
assert (locator && " Null locator" );
3696
3698
if (!locator->getAnchor ())
@@ -3755,7 +3757,8 @@ resolveLocatorToDecl(ConstraintSystem &cs, ConstraintLocator *locator,
3755
3757
if (auto selected = findOvlChoice (anchorLocator)) {
3756
3758
if (selected->choice .isDecl ())
3757
3759
return getConcreteDeclRef (selected->choice .getDecl (),
3758
- selected->openedType );
3760
+ selected->openedType ,
3761
+ anchorLocator);
3759
3762
}
3760
3763
}
3761
3764
@@ -3766,7 +3769,8 @@ resolveLocatorToDecl(ConstraintSystem &cs, ConstraintLocator *locator,
3766
3769
if (auto selected = findOvlChoice (anchorLocator)) {
3767
3770
if (selected->choice .isDecl ())
3768
3771
return getConcreteDeclRef (selected->choice .getDecl (),
3769
- selected->openedType );
3772
+ selected->openedType ,
3773
+ anchorLocator);
3770
3774
}
3771
3775
}
3772
3776
@@ -3832,8 +3836,8 @@ findDefaultArgsOwner(ConstraintSystem &cs, const Solution &solution,
3832
3836
3833
3837
return known->second ;
3834
3838
},
3835
- [&](ValueDecl *decl,
3836
- Type openedType) -> ConcreteDeclRef {
3839
+ [&](ValueDecl *decl, Type openedType, ConstraintLocator *locator)
3840
+ -> ConcreteDeclRef {
3837
3841
if (decl->getInnermostDeclContext ()->isGenericContext ()) {
3838
3842
SmallVector<Substitution, 4 > subs;
3839
3843
solution.computeSubstitutions (
@@ -4039,41 +4043,25 @@ Expr *ExprRewriter::coerceTupleToTuple(Expr *expr, TupleType *fromTuple,
4039
4043
SmallVector<TupleTypeElt, 4 > fromTupleExprFields (
4040
4044
fromTuple->getElements ().size ());
4041
4045
SmallVector<Expr *, 2 > callerDefaultArgs;
4042
- ConcreteDeclRef defaultArgsOwner;
4046
+ ConcreteDeclRef defaultArgsOwner =
4047
+ findDefaultArgsOwner (cs, solution, cs.getConstraintLocator (locator));
4043
4048
4044
4049
for (unsigned i = 0 , n = toTuple->getNumElements (); i != n; ++i) {
4045
4050
const auto &toElt = toTuple->getElement (i);
4046
4051
auto toEltType = toElt.getType ();
4047
4052
4048
4053
// If we're default-initializing this member, there's nothing to do.
4049
4054
if (sources[i] == TupleShuffleExpr::DefaultInitialize) {
4050
- // Dig out the owner of the default arguments.
4051
- ConcreteDeclRef argOwner;
4052
- if (!defaultArgsOwner) {
4053
- argOwner
4054
- = findDefaultArgsOwner (cs, solution,
4055
- cs.getConstraintLocator (locator));
4056
- assert (argOwner && " Missing default arguments owner?" );
4057
- } else {
4058
- argOwner = defaultArgsOwner;
4059
- }
4060
-
4061
4055
anythingShuffled = true ;
4062
4056
hasInits = true ;
4063
4057
toSugarFields.push_back (toElt);
4064
4058
4065
4059
// Create a caller-side default argument, if we need one.
4066
4060
if (auto defArg = getCallerDefaultArg (tc, dc, expr->getLoc (),
4067
- argOwner , i).first ) {
4061
+ defaultArgsOwner , i).first ) {
4068
4062
callerDefaultArgs.push_back (defArg);
4069
4063
sources[i] = TupleShuffleExpr::CallerDefaultInitialize;
4070
4064
}
4071
- if (!defaultArgsOwner) {
4072
- defaultArgsOwner = argOwner;
4073
- } else {
4074
- assert (defaultArgsOwner == argOwner &&
4075
- " default args on same func have different owners" );
4076
- }
4077
4065
continue ;
4078
4066
}
4079
4067
@@ -4311,7 +4299,9 @@ Expr *ExprRewriter::coerceScalarToTuple(Expr *expr, TupleType *toTuple,
4311
4299
SmallVector<int , 4 > elements;
4312
4300
SmallVector<unsigned , 1 > variadicArgs;
4313
4301
SmallVector<Expr*, 4 > callerDefaultArgs;
4314
- ConcreteDeclRef defaultArgsOwner = nullptr ;
4302
+ ConcreteDeclRef defaultArgsOwner =
4303
+ findDefaultArgsOwner (cs, solution, cs.getConstraintLocator (locator));
4304
+
4315
4305
i = 0 ;
4316
4306
for (auto &field : toTuple->getElements ()) {
4317
4307
if (field.isVararg ()) {
@@ -4332,20 +4322,9 @@ Expr *ExprRewriter::coerceScalarToTuple(Expr *expr, TupleType *toTuple,
4332
4322
4333
4323
assert (field.hasDefaultArg () && " Expected a default argument" );
4334
4324
4335
- ConcreteDeclRef argOwner;
4336
- // Dig out the owner of the default arguments.
4337
- if (!defaultArgsOwner) {
4338
- argOwner
4339
- = findDefaultArgsOwner (cs, solution,
4340
- cs.getConstraintLocator (locator));
4341
- assert (argOwner && " Missing default arguments owner?" );
4342
- } else {
4343
- argOwner = defaultArgsOwner;
4344
- }
4345
-
4346
4325
// Create a caller-side default argument, if we need one.
4347
4326
if (auto defArg = getCallerDefaultArg (tc, dc, expr->getLoc (),
4348
- argOwner , i).first ) {
4327
+ defaultArgsOwner , i).first ) {
4349
4328
// Record the caller-side default argument expression.
4350
4329
// FIXME: Do we need to record what this was synthesized from?
4351
4330
elements.push_back (TupleShuffleExpr::CallerDefaultInitialize);
@@ -4354,13 +4333,6 @@ Expr *ExprRewriter::coerceScalarToTuple(Expr *expr, TupleType *toTuple,
4354
4333
// Record the owner of the default argument.
4355
4334
elements.push_back (TupleShuffleExpr::DefaultInitialize);
4356
4335
}
4357
- if (!defaultArgsOwner) {
4358
- defaultArgsOwner = argOwner;
4359
- } else {
4360
- assert (defaultArgsOwner == argOwner &&
4361
- " default args on same func have different owners" );
4362
- }
4363
-
4364
4336
++i;
4365
4337
}
4366
4338
@@ -4642,7 +4614,8 @@ Expr *ExprRewriter::coerceCallArguments(Expr *arg, Type paramType,
4642
4614
SmallVector<Expr*, 4 > fromTupleExpr (argTuple? argTuple->getNumElements () : 1 );
4643
4615
SmallVector<unsigned , 4 > variadicArgs;
4644
4616
SmallVector<Expr *, 2 > callerDefaultArgs;
4645
- ConcreteDeclRef defaultArgsOwner = nullptr ;
4617
+ ConcreteDeclRef defaultArgsOwner =
4618
+ findDefaultArgsOwner (cs, solution, cs.getConstraintLocator (locator));
4646
4619
Type sliceType = nullptr ;
4647
4620
SmallVector<int , 4 > sources;
4648
4621
for (unsigned paramIdx = 0 , numParams = parameterBindings.size ();
@@ -4696,22 +4669,12 @@ Expr *ExprRewriter::coerceCallArguments(Expr *arg, Type paramType,
4696
4669
4697
4670
// If we are using a default argument, handle it now.
4698
4671
if (parameterBindings[paramIdx].empty ()) {
4699
- // Dig out the owner of the default arguments.
4700
- ConcreteDeclRef argOwner;
4701
- if (!defaultArgsOwner) {
4702
- argOwner
4703
- = findDefaultArgsOwner (cs, solution,
4704
- cs.getConstraintLocator (locator));
4705
- assert (argOwner && " Missing default arguments owner?" );
4706
- } else {
4707
- argOwner = defaultArgsOwner;
4708
- }
4709
-
4710
4672
// Create a caller-side default argument, if we need one.
4711
4673
Expr *defArg;
4712
4674
DefaultArgumentKind defArgKind;
4713
4675
std::tie (defArg, defArgKind) = getCallerDefaultArg (tc, dc, arg->getLoc (),
4714
- argOwner, paramIdx);
4676
+ defaultArgsOwner,
4677
+ paramIdx);
4715
4678
4716
4679
// Note that we'll be doing a shuffle involving default arguments.
4717
4680
anythingShuffled = true ;
@@ -4730,12 +4693,6 @@ Expr *ExprRewriter::coerceCallArguments(Expr *arg, Type paramType,
4730
4693
} else {
4731
4694
sources.push_back (TupleShuffleExpr::DefaultInitialize);
4732
4695
}
4733
- if (!defaultArgsOwner) {
4734
- defaultArgsOwner = argOwner;
4735
- } else {
4736
- assert (defaultArgsOwner == argOwner &&
4737
- " default args on same func have different owners" );
4738
- }
4739
4696
continue ;
4740
4697
}
4741
4698
0 commit comments