@@ -238,33 +238,38 @@ static bool isDeclMoreConstrainedThan(ValueDecl *decl1, ValueDecl *decl2) {
238238 if (decl1->getKind () != decl2->getKind () || isa<TypeDecl>(decl1))
239239 return false ;
240240
241- GenericParamList *gp1 = nullptr , *gp2 = nullptr ;
241+ bool bothGeneric = false ;
242+ GenericSignature sig1, sig2;
242243
243244 auto func1 = dyn_cast<FuncDecl>(decl1);
244245 auto func2 = dyn_cast<FuncDecl>(decl2);
245246 if (func1 && func2) {
246- gp1 = func1->getGenericParams ();
247- gp2 = func2->getGenericParams ();
247+ bothGeneric = func1->isGeneric () && func2->isGeneric ();
248+
249+ sig1 = func1->getGenericSignature ();
250+ sig2 = func2->getGenericSignature ();
248251 }
249252
250253 auto subscript1 = dyn_cast<SubscriptDecl>(decl1);
251254 auto subscript2 = dyn_cast<SubscriptDecl>(decl2);
252255 if (subscript1 && subscript2) {
253- gp1 = subscript1->getGenericParams ();
254- gp2 = subscript2->getGenericParams ();
256+ bothGeneric = subscript1->isGeneric () && subscript2->isGeneric ();
257+
258+ sig1 = subscript1->getGenericSignature ();
259+ sig2 = subscript2->getGenericSignature ();
255260 }
256261
257- if (gp1 && gp2 ) {
258- auto params1 = gp1-> getParams ();
259- auto params2 = gp2-> getParams ();
262+ if (bothGeneric ) {
263+ auto params1 = sig1. getInnermostGenericParams ();
264+ auto params2 = sig2. getInnermostGenericParams ();
260265
261266 if (params1.size () == params2.size ()) {
262267 for (size_t i = 0 ; i < params1.size (); i++) {
263268 auto p1 = params1[i];
264269 auto p2 = params2[i];
265270
266- int np1 = static_cast <int >(p1-> getConformingProtocols ( ).size ());
267- int np2 = static_cast <int >(p2-> getConformingProtocols ( ).size ());
271+ int np1 = static_cast <int >(sig1-> getRequiredProtocols (p1 ).size ());
272+ int np2 = static_cast <int >(sig2-> getRequiredProtocols (p2 ).size ());
268273 int aDelta = np1 - np2;
269274
270275 if (aDelta)
0 commit comments