File tree Expand file tree Collapse file tree 1 file changed +20
-0
lines changed Expand file tree Collapse file tree 1 file changed +20
-0
lines changed Original file line number Diff line number Diff 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 }
You can’t perform that action at this time.
0 commit comments