@@ -1050,6 +1050,7 @@ namespace {
1050
1050
if (memberTypes.empty ())
1051
1051
hasExplicitAnyObject = true ;
1052
1052
1053
+ // Generic arguments are always imported as existential types.
1053
1054
Type importedTypeArg = ExistentialType::get (
1054
1055
ProtocolCompositionType::get (
1055
1056
Impl.SwiftContext , memberTypes,
@@ -1182,9 +1183,6 @@ namespace {
1182
1183
}
1183
1184
}
1184
1185
1185
- if (bridgedType->isConstraintType ())
1186
- bridgedType = ExistentialType::get (bridgedType);
1187
-
1188
1186
return { importedType,
1189
1187
ImportHint (ImportHint::ObjCBridged, bridgedType) };
1190
1188
}
@@ -1205,9 +1203,9 @@ namespace {
1205
1203
members.push_back (proto->getDeclaredInterfaceType ());
1206
1204
}
1207
1205
1208
- importedType = ExistentialType::get (
1206
+ importedType =
1209
1207
ProtocolCompositionType::get (Impl.SwiftContext , members,
1210
- /* HasExplicitAnyObject=*/ false )) ;
1208
+ /* HasExplicitAnyObject=*/ false );
1211
1209
}
1212
1210
1213
1211
// Class or Class<P> maps to an existential metatype.
@@ -1285,6 +1283,32 @@ static bool isCFAudited(ImportTypeKind importKind) {
1285
1283
llvm_unreachable (" Invalid ImportTypeKind." );
1286
1284
}
1287
1285
1286
+ // / True if the type can be an existential type in this context.
1287
+ static bool isExistentialContext (ImportTypeKind importKind) {
1288
+ switch (importKind) {
1289
+ case ImportTypeKind::Abstract:
1290
+ case ImportTypeKind::Typedef:
1291
+ return false ;
1292
+ case ImportTypeKind::Value:
1293
+ case ImportTypeKind::ObjCCollectionElement:
1294
+ case ImportTypeKind::Variable:
1295
+ case ImportTypeKind::Result:
1296
+ case ImportTypeKind::Enum:
1297
+ case ImportTypeKind::RecordField:
1298
+ case ImportTypeKind::AuditedVariable:
1299
+ case ImportTypeKind::AuditedResult:
1300
+ case ImportTypeKind::Parameter:
1301
+ case ImportTypeKind::CompletionHandlerResultParameter:
1302
+ case ImportTypeKind::CFRetainedOutParameter:
1303
+ case ImportTypeKind::CFUnretainedOutParameter:
1304
+ case ImportTypeKind::Property:
1305
+ case ImportTypeKind::PropertyWithReferenceSemantics:
1306
+ return true ;
1307
+ }
1308
+
1309
+ llvm_unreachable (" Invalid ImportTypeKind." );
1310
+ }
1311
+
1288
1312
// / Turn T into Unmanaged<T>.
1289
1313
static Type getUnmanagedType (ClangImporter::Implementation &impl,
1290
1314
Type payloadType) {
@@ -1550,6 +1574,11 @@ static ImportedType adjustTypeForConcreteImport(
1550
1574
1551
1575
assert (importedType);
1552
1576
1577
+ if (importedType->isConstraintType () &&
1578
+ isExistentialContext (importKind)) {
1579
+ importedType = ExistentialType::get (importedType);
1580
+ }
1581
+
1553
1582
if (importKind == ImportTypeKind::RecordField &&
1554
1583
importedType->isAnyClassReferenceType () &&
1555
1584
!importedType->isForeignReferenceType ()) {
0 commit comments