@@ -960,6 +960,67 @@ Type TypeBase::stripConcurrency(bool recurse, bool dropGlobalActor) {
960
960
return newFnType;
961
961
}
962
962
963
+ if (auto existentialType = getAs<ExistentialType>()) {
964
+ auto newConstraintType = existentialType->getConstraintType ()
965
+ ->stripConcurrency (recurse, dropGlobalActor);
966
+ if (newConstraintType.getPointer () ==
967
+ existentialType->getConstraintType ().getPointer ())
968
+ return Type (this );
969
+
970
+ return ExistentialType::get (newConstraintType);
971
+ }
972
+
973
+ if (auto protocolType = getAs<ProtocolType>()) {
974
+ if (protocolType->getDecl ()->isSpecificProtocol (
975
+ KnownProtocolKind::Sendable))
976
+ return ProtocolCompositionType::get (getASTContext (), { }, false );
977
+
978
+ return Type (this );
979
+ }
980
+
981
+ if (auto protocolCompositionType = getAs<ProtocolCompositionType>()) {
982
+ SmallVector<Type, 4 > newMembers;
983
+ auto members = protocolCompositionType->getMembers ();
984
+ for (unsigned i : indices (members)) {
985
+ auto memberType = members[i];
986
+ auto newMemberType =
987
+ memberType->stripConcurrency (recurse, dropGlobalActor);
988
+ if (!newMembers.empty ()) {
989
+ newMembers.push_back (newMemberType);
990
+ continue ;
991
+ }
992
+
993
+ if (memberType.getPointer () != newMemberType.getPointer ()) {
994
+ newMembers.append (members.begin (), members.begin () + i);
995
+ newMembers.push_back (newMemberType);
996
+ continue ;
997
+ }
998
+ }
999
+
1000
+ if (!newMembers.empty ()) {
1001
+ return ProtocolCompositionType::get (
1002
+ getASTContext (), newMembers,
1003
+ protocolCompositionType->hasExplicitAnyObject ());
1004
+ }
1005
+
1006
+ return Type (this );
1007
+ }
1008
+
1009
+ if (auto existentialMetatype = getAs<ExistentialMetatypeType>()) {
1010
+ auto instanceType = existentialMetatype->getExistentialInstanceType ();
1011
+ auto newInstanceType =
1012
+ instanceType->stripConcurrency (recurse, dropGlobalActor);
1013
+ if (instanceType.getPointer () != newInstanceType.getPointer ()) {
1014
+ Optional<MetatypeRepresentation> repr;
1015
+ if (existentialMetatype->hasRepresentation ())
1016
+ repr = existentialMetatype->getRepresentation ();
1017
+ return ExistentialMetatypeType::get (
1018
+ newInstanceType, repr, getASTContext ());
1019
+ }
1020
+
1021
+ return Type (this );
1022
+ }
1023
+
963
1024
return Type (this );
964
1025
}
965
1026
0 commit comments