@@ -222,6 +222,13 @@ SourceLoc getTypeLoc(AbstractStorageDecl *storage, Decl *owner = nullptr) {
222222 return loc;
223223}
224224
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+
225232class ABIDeclChecker : public ASTComparisonVisitor <ABIDeclChecker> {
226233 ASTContext &ctx;
227234 Decl *diagnoseOnDecl;
@@ -371,6 +378,8 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
371378
372379 didDiagnose |= checkType (apiNorm.getPlainType (), abiNorm.getPlainType (),
373380 apiTypeLoc, abiTypeLoc,
381+ getGenericSignature (apiDecl),
382+ getGenericSignature (abiDecl),
374383 TypeOrigin::forParameter (abi));
375384
376385 didDiagnose |= checkParameterFlags (apiNorm.getParameterFlags (),
@@ -471,6 +480,8 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
471480
472481 didDiagnose |= checkType (apiThrowType, abiThrowType,
473482 api.throwsLoc , abi.throwsLoc ,
483+ getGenericSignature (apiDecl),
484+ getGenericSignature (abiDecl),
474485 TypeOrigin::forThrowsEffect ());
475486 }
476487
@@ -621,10 +632,9 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
621632 bool visitDecl (Decl *api, Decl *abi) {
622633 bool didDiagnose = checkAttrs (api->getAttrs (), abi->getAttrs (), api, abi);
623634
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),
628638 api, abi);
629639 }
630640
@@ -706,6 +716,7 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
706716 abi->getResultInterfaceType (),
707717 api->getResultTypeSourceRange ().Start ,
708718 abi->getResultTypeSourceRange ().Start ,
719+ getGenericSignature (api), getGenericSignature (abi),
709720 TypeOrigin::forResult ());
710721 }
711722
@@ -723,6 +734,7 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
723734
724735 if (checkType (api->getValueInterfaceType (), abi->getValueInterfaceType (),
725736 getTypeLoc (api), getTypeLoc (abi),
737+ getGenericSignature (api), getGenericSignature (abi),
726738 TypeOrigin::forUnspecified ()))
727739 return true ;
728740
@@ -934,10 +946,11 @@ class ABIDeclChecker : public ASTComparisonVisitor<ABIDeclChecker> {
934946 // MARK: @abi checking - types
935947
936948 bool checkType (Type api, Type abi, SourceLoc apiLoc, SourceLoc abiLoc,
949+ GenericSignature apiSig, GenericSignature abiSig,
937950 TypeOrigin origin) {
938951 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) );
941954 if (apiNorm->isEqual (abiNorm)) {
942955 return false ;
943956 }
0 commit comments