@@ -734,6 +734,20 @@ static bool isNSObjectHashValue(ValueDecl *baseDecl) {
734
734
return false ;
735
735
}
736
736
737
+ // / Returns true if the given declaration is for the `NSObject.hash(into:)`
738
+ // / function.
739
+ static bool isNSObjectHashMethod (ValueDecl *baseDecl) {
740
+ auto baseFunc = dyn_cast<FuncDecl>(baseDecl);
741
+ if (!baseFunc)
742
+ return false ;
743
+
744
+ if (auto classDecl = baseFunc->getDeclContext ()->getSelfClassDecl ()) {
745
+ ASTContext &ctx = baseDecl->getASTContext ();
746
+ return baseFunc->getBaseName () == ctx.Id_hash && classDecl->isNSObject ();
747
+ }
748
+ return false ;
749
+ }
750
+
737
751
namespace {
738
752
// / Class that handles the checking of a particular declaration against
739
753
// / superclass entities that it could override.
@@ -995,11 +1009,13 @@ static void checkOverrideAccessControl(ValueDecl *baseDecl, ValueDecl *decl,
995
1009
!baseHasOpenAccess &&
996
1010
baseDecl->getModuleContext () != decl->getModuleContext () &&
997
1011
!isa<ConstructorDecl>(decl)) {
998
- // NSObject.hashValue was made non-overridable in Swift 5; one should
999
- // override NSObject.hash instead.
1012
+ // NSObject.hashValue and NSObject.hash(into:) was made non-overridable in
1013
+ // Swift 5; one should override NSObject.hash instead.
1000
1014
if (isNSObjectHashValue (baseDecl)) {
1001
1015
diags.diagnose (decl, diag::override_nsobject_hashvalue_error)
1002
1016
.fixItReplace (SourceRange (decl->getNameLoc ()), " hash" );
1017
+ } else if (isNSObjectHashMethod (baseDecl)) {
1018
+ diags.diagnose (decl, diag::override_nsobject_hash_error);
1003
1019
} else {
1004
1020
diags.diagnose (decl, diag::override_of_non_open,
1005
1021
decl->getDescriptiveKind ());
@@ -1791,11 +1807,11 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
1791
1807
(isa<ExtensionDecl>(base->getDeclContext ()) ||
1792
1808
isa<ExtensionDecl>(override ->getDeclContext ())) &&
1793
1809
!base->isObjC ()) {
1794
- // Suppress this diagnostic for overrides of a non-open NSObject.hashValue
1795
- // property ; these are diagnosed elsewhere. An error message complaining
1810
+ // Suppress this diagnostic for overrides of a non-open NSObject.Hashable
1811
+ // interfaces ; these are diagnosed elsewhere. An error message complaining
1796
1812
// about extensions would be misleading in this case; the correct fix is to
1797
1813
// override NSObject.hash instead.
1798
- if (isNSObjectHashValue (base) &&
1814
+ if (( isNSObjectHashValue (base) || isNSObjectHashMethod (base)) &&
1799
1815
!base->hasOpenAccess (override ->getDeclContext ()))
1800
1816
return true ;
1801
1817
bool baseCanBeObjC = canBeRepresentedInObjC (base);
0 commit comments