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 {
1421
1421
OptionSet<OpenedExistentialAdjustmentFlags>;
1422
1422
}
1423
1423
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
+
1424
1436
/// Determine whether we should open up the existential argument to the
1425
1437
/// given parameters.
1426
1438
///
@@ -1457,6 +1469,14 @@ shouldOpenExistentialCallArgument(
1457
1469
return None;
1458
1470
1459
1471
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
+
1460
1480
case DeclTypeCheckingSemantics::WithoutActuallyEscaping:
1461
1481
break;
1462
1482
}
You can’t perform that action at this time.
0 commit comments