Skip to content

Commit 5b0d1fd

Browse files
committed
Don't open existentials for library builtin shims
1 parent 0ca0629 commit 5b0d1fd

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

lib/Sema/CSSimplify.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,6 +1421,18 @@ namespace {
14211421
OptionSet<OpenedExistentialAdjustmentFlags>;
14221422
}
14231423

1424+
/// Determine if this function is part of the _isUnique family of functions in
1425+
/// the standard library.
1426+
static bool isStdlibUniqueFunction(ValueDecl *callee) {
1427+
if (!callee->isStdlibDecl())
1428+
return false;
1429+
1430+
auto baseName = callee->getName().getBaseName().userFacingName();
1431+
return baseName == "_isUnique" || baseName == "_isUnique_native" ||
1432+
baseName == "_COWBufferForReading" ||
1433+
baseName == "_unsafeDowncastToAnyObject";
1434+
}
1435+
14241436
/// Determine whether we should open up the existential argument to the
14251437
/// given parameters.
14261438
///
@@ -1457,6 +1469,14 @@ shouldOpenExistentialCallArgument(
14571469
return None;
14581470

14591471
case DeclTypeCheckingSemantics::Normal:
1472+
// _isUnique and friends are special because opening an existential when
1473+
// calling them would make them non-unique.
1474+
// FIXME: Borrowing properly from the existential box would probably
1475+
// eliminate this.
1476+
if (isStdlibUniqueFunction(callee))
1477+
return None;
1478+
break;
1479+
14601480
case DeclTypeCheckingSemantics::WithoutActuallyEscaping:
14611481
break;
14621482
}

0 commit comments

Comments
 (0)