@@ -238,33 +238,38 @@ static bool isDeclMoreConstrainedThan(ValueDecl *decl1, ValueDecl *decl2) {
238
238
if (decl1->getKind () != decl2->getKind () || isa<TypeDecl>(decl1))
239
239
return false ;
240
240
241
- GenericParamList *gp1 = nullptr , *gp2 = nullptr ;
241
+ bool bothGeneric = false ;
242
+ GenericSignature sig1, sig2;
242
243
243
244
auto func1 = dyn_cast<FuncDecl>(decl1);
244
245
auto func2 = dyn_cast<FuncDecl>(decl2);
245
246
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 ();
248
251
}
249
252
250
253
auto subscript1 = dyn_cast<SubscriptDecl>(decl1);
251
254
auto subscript2 = dyn_cast<SubscriptDecl>(decl2);
252
255
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 ();
255
260
}
256
261
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 ();
260
265
261
266
if (params1.size () == params2.size ()) {
262
267
for (size_t i = 0 ; i < params1.size (); i++) {
263
268
auto p1 = params1[i];
264
269
auto p2 = params2[i];
265
270
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 ());
268
273
int aDelta = np1 - np2;
269
274
270
275
if (aDelta)
0 commit comments