@@ -4115,7 +4115,6 @@ CanType ProtocolCompositionType::getMinimalCanonicalType(
41154115 return Reqs.front ().getSecondType ()->getCanonicalType ();
41164116 }
41174117
4118- Type superclass;
41194118 llvm::SmallVector<Type, 2 > MinimalMembers;
41204119 bool MinimalHasExplicitAnyObject = false ;
41214120 auto ifaceTy = Sig.getGenericParams ().back ();
@@ -4126,10 +4125,6 @@ CanType ProtocolCompositionType::getMinimalCanonicalType(
41264125
41274126 switch (Req.getKind ()) {
41284127 case RequirementKind::Superclass:
4129- assert ((!superclass || superclass->isEqual (Req.getSecondType ()))
4130- && " Multiple distinct superclass constraints!" );
4131- superclass = Req.getSecondType ();
4132- break ;
41334128 case RequirementKind::Conformance:
41344129 MinimalMembers.push_back (Req.getSecondType ());
41354130 break ;
@@ -4141,10 +4136,16 @@ CanType ProtocolCompositionType::getMinimalCanonicalType(
41414136 }
41424137 }
41434138
4144- // Ensure superclass bounds appear first regardless of their order among
4145- // the signature's requirements.
4146- if (superclass)
4147- MinimalMembers.insert (MinimalMembers.begin (), superclass->getCanonicalType ());
4139+ // A superclass constraint is always retained and must appear first in the
4140+ // members list.
4141+ assert (Composition->getMembers ().front ()->getClassOrBoundGenericClass () ==
4142+ MinimalMembers.front ()->getClassOrBoundGenericClass ());
4143+
4144+ // If we are left with a single member and no layout constraint, the member
4145+ // is the minimal type. Also, note that a protocol composition cannot be
4146+ // constructed with a single member unless there is a layout constraint.
4147+ if (MinimalMembers.size () == 1 && !MinimalHasExplicitAnyObject)
4148+ return CanType (MinimalMembers.front ());
41484149
41494150 // The resulting composition is necessarily canonical.
41504151 return CanType (build (Ctx, MinimalMembers, MinimalHasExplicitAnyObject));
0 commit comments