Skip to content

Commit cfd4503

Browse files
committed
Don't mutate defaultArgsOwner with getCallerDefaultArg() directly, so we
can make a more precise assertion that all default arguments have the same owner. <rdar://problem/20749423> Compiler crashed while building simple subclass code Swift SVN r28251
1 parent 35c55f3 commit cfd4503

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

lib/Sema/CSApply.cpp

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3694,15 +3694,14 @@ Expr *ExprRewriter::coerceTupleToTuple(Expr *expr, TupleType *fromTuple,
36943694
// If we're default-initializing this member, there's nothing to do.
36953695
if (sources[i] == TupleShuffleExpr::DefaultInitialize) {
36963696
// Dig out the owner of the default arguments.
3697+
ConcreteDeclRef argOwner;
36973698
if (!defaultArgsOwner) {
3698-
defaultArgsOwner
3699+
argOwner
36993700
= findDefaultArgsOwner(cs, solution,
37003701
cs.getConstraintLocator(locator));
3701-
assert(defaultArgsOwner && "Missing default arguments owner?");
3702+
assert(argOwner && "Missing default arguments owner?");
37023703
} else {
3703-
assert(findDefaultArgsOwner(cs, solution,
3704-
cs.getConstraintLocator(locator))
3705-
== defaultArgsOwner);
3704+
argOwner = defaultArgsOwner;
37063705
}
37073706

37083707
anythingShuffled = true;
@@ -3711,10 +3710,16 @@ Expr *ExprRewriter::coerceTupleToTuple(Expr *expr, TupleType *fromTuple,
37113710

37123711
// Create a caller-side default argument, if we need one.
37133712
if (auto defArg = getCallerDefaultArg(tc, dc, expr->getLoc(),
3714-
defaultArgsOwner, i).first) {
3713+
argOwner, i).first) {
37153714
callerDefaultArgs.push_back(defArg);
37163715
sources[i] = TupleShuffleExpr::CallerDefaultInitialize;
37173716
}
3717+
if (!defaultArgsOwner) {
3718+
defaultArgsOwner = argOwner;
3719+
} else {
3720+
assert(defaultArgsOwner == argOwner &&
3721+
"default args on same func have different owners");
3722+
}
37183723
continue;
37193724
}
37203725

@@ -3956,21 +3961,20 @@ Expr *ExprRewriter::coerceScalarToTuple(Expr *expr, TupleType *toTuple,
39563961

39573962
assert(field.hasInit() && "Expected a default argument");
39583963

3964+
ConcreteDeclRef argOwner;
39593965
// Dig out the owner of the default arguments.
39603966
if (!defaultArgsOwner) {
3961-
defaultArgsOwner
3967+
argOwner
39623968
= findDefaultArgsOwner(cs, solution,
39633969
cs.getConstraintLocator(locator));
3964-
assert(defaultArgsOwner && "Missing default arguments owner?");
3970+
assert(argOwner && "Missing default arguments owner?");
39653971
} else {
3966-
assert(findDefaultArgsOwner(cs, solution,
3967-
cs.getConstraintLocator(locator))
3968-
== defaultArgsOwner);
3972+
argOwner = defaultArgsOwner;
39693973
}
39703974

39713975
// Create a caller-side default argument, if we need one.
39723976
if (auto defArg = getCallerDefaultArg(tc, dc, expr->getLoc(),
3973-
defaultArgsOwner, i).first) {
3977+
argOwner, i).first) {
39743978
// Record the caller-side default argument expression.
39753979
// FIXME: Do we need to record what this was synthesized from?
39763980
elements.push_back(TupleShuffleExpr::CallerDefaultInitialize);
@@ -3979,6 +3983,12 @@ Expr *ExprRewriter::coerceScalarToTuple(Expr *expr, TupleType *toTuple,
39793983
// Record the owner of the default argument.
39803984
elements.push_back(TupleShuffleExpr::DefaultInitialize);
39813985
}
3986+
if (!defaultArgsOwner) {
3987+
defaultArgsOwner = argOwner;
3988+
} else {
3989+
assert(defaultArgsOwner == argOwner &&
3990+
"default args on same func have different owners");
3991+
}
39823992

39833993
++i;
39843994
}
@@ -4309,23 +4319,21 @@ Expr *ExprRewriter::coerceCallArguments(Expr *arg, Type paramType,
43094319
// If we are using a default argument, handle it now.
43104320
if (parameterBindings[paramIdx].empty()) {
43114321
// Dig out the owner of the default arguments.
4322+
ConcreteDeclRef argOwner;
43124323
if (!defaultArgsOwner) {
4313-
defaultArgsOwner
4324+
argOwner
43144325
= findDefaultArgsOwner(cs, solution,
43154326
cs.getConstraintLocator(locator));
4316-
assert(defaultArgsOwner && "Missing default arguments owner?");
4327+
assert(argOwner && "Missing default arguments owner?");
43174328
} else {
4318-
assert(findDefaultArgsOwner(cs, solution,
4319-
cs.getConstraintLocator(locator))
4320-
== defaultArgsOwner);
4329+
argOwner = defaultArgsOwner;
43214330
}
43224331

43234332
// Create a caller-side default argument, if we need one.
43244333
Expr *defArg;
43254334
DefaultArgumentKind defArgKind;
43264335
std::tie(defArg, defArgKind) = getCallerDefaultArg(tc, dc, arg->getLoc(),
4327-
defaultArgsOwner,
4328-
paramIdx);
4336+
argOwner, paramIdx);
43294337

43304338
// Note that we'll be doing a shuffle involving default arguments.
43314339
anythingShuffled = true;
@@ -4344,6 +4352,12 @@ Expr *ExprRewriter::coerceCallArguments(Expr *arg, Type paramType,
43444352
} else {
43454353
sources.push_back(TupleShuffleExpr::DefaultInitialize);
43464354
}
4355+
if (!defaultArgsOwner) {
4356+
defaultArgsOwner = argOwner;
4357+
} else {
4358+
assert(defaultArgsOwner == argOwner &&
4359+
"default args on same func have different owners");
4360+
}
43474361
continue;
43484362
}
43494363

test/decl/func/default-values.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,10 @@ class SomeDerivedClass2 : SomeClass2 {
8282
func shouldNotCrash(a : UndefinedType, bar b : Bool = true) { // expected-error {{use of undeclared type 'UndefinedType'}}
8383
}
8484

85+
// <rdar://problem/20749423> Compiler crashed while building simple subclass
86+
// code
87+
class SomeClass3 {
88+
init(x: Int = 5, y: Int = 5) {}
89+
}
90+
class SomeDerivedClass3 : SomeClass3 {}
91+
let _ = SomeDerivedClass3()

0 commit comments

Comments
 (0)