@@ -222,6 +222,13 @@ SourceLoc getTypeLoc(AbstractStorageDecl *storage, Decl *owner = nullptr) {
222
222
return loc;
223
223
}
224
224
225
+ // / Get a decl's generic signature, if it has one.
226
+ GenericSignature getGenericSignature (Decl *decl) {
227
+ if (auto genericCtx = decl->getAsGenericContext ())
228
+ return genericCtx->getGenericSignature ();
229
+ return GenericSignature ();
230
+ }
231
+
225
232
class ABIDeclChecker : public ASTComparisonVisitor <ABIDeclChecker> {
226
233
ASTContext &ctx;
227
234
Decl *diagnoseOnDecl;
@@ -371,6 +378,8 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
371
378
372
379
didDiagnose |= checkType (apiNorm.getPlainType (), abiNorm.getPlainType (),
373
380
apiTypeLoc, abiTypeLoc,
381
+ getGenericSignature (apiDecl),
382
+ getGenericSignature (abiDecl),
374
383
TypeOrigin::forParameter (abi));
375
384
376
385
didDiagnose |= checkParameterFlags (apiNorm.getParameterFlags (),
@@ -471,6 +480,8 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
471
480
472
481
didDiagnose |= checkType (apiThrowType, abiThrowType,
473
482
api.throwsLoc , abi.throwsLoc ,
483
+ getGenericSignature (apiDecl),
484
+ getGenericSignature (abiDecl),
474
485
TypeOrigin::forThrowsEffect ());
475
486
}
476
487
@@ -621,10 +632,9 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
621
632
bool visitDecl (Decl *api, Decl *abi) {
622
633
bool didDiagnose = checkAttrs (api->getAttrs (), abi->getAttrs (), api, abi);
623
634
624
- if (auto apiGenericCtx = api->getAsGenericContext ()) {
625
- auto abiGenericCtx = abi->getAsGenericContext ();
626
- didDiagnose |= checkGenericSignature (apiGenericCtx->getGenericSignature (),
627
- abiGenericCtx->getGenericSignature (),
635
+ if (api->getAsGenericContext ()) {
636
+ didDiagnose |= checkGenericSignature (getGenericSignature (api),
637
+ getGenericSignature (abi),
628
638
api, abi);
629
639
}
630
640
@@ -706,6 +716,7 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
706
716
abi->getResultInterfaceType (),
707
717
api->getResultTypeSourceRange ().Start ,
708
718
abi->getResultTypeSourceRange ().Start ,
719
+ getGenericSignature (api), getGenericSignature (abi),
709
720
TypeOrigin::forResult ());
710
721
}
711
722
@@ -723,6 +734,7 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
723
734
724
735
if (checkType (api->getValueInterfaceType (), abi->getValueInterfaceType (),
725
736
getTypeLoc (api), getTypeLoc (abi),
737
+ getGenericSignature (api), getGenericSignature (abi),
726
738
TypeOrigin::forUnspecified ()))
727
739
return true ;
728
740
@@ -934,10 +946,11 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
934
946
// MARK: @abi checking - types
935
947
936
948
bool checkType (Type api, Type abi, SourceLoc apiLoc, SourceLoc abiLoc,
949
+ GenericSignature apiSig, GenericSignature abiSig,
937
950
TypeOrigin origin) {
938
951
if (!api.isNull () && !abi.isNull ()) {
939
- Type apiNorm = normalizeType (api);
940
- Type abiNorm = normalizeType (abi);
952
+ Type apiNorm = normalizeType (api-> getReducedType (apiSig) );
953
+ Type abiNorm = normalizeType (abi-> getReducedType (abiSig) );
941
954
if (apiNorm->isEqual (abiNorm)) {
942
955
return false ;
943
956
}
0 commit comments