@@ -3011,59 +3011,74 @@ class ObjCImplementationChecker {
3011
3011
diagnose (afd, diag::objc_implementation_member_requires_vtable, afd);
3012
3012
}
3013
3013
3014
- void addRequirements (IterableDeclContext *idc) {
3015
- assert (idc->getDecl ()->hasClangNode ());
3016
- for (Decl *_member : idc->getMembers ()) {
3017
- // Skip accessors; we'll match their storage instead.
3018
- auto member = dyn_cast<ValueDecl>(_member);
3019
- if (!member || isa<AccessorDecl>(member))
3020
- continue ;
3014
+ void addRequirement (Decl *D) {
3015
+ auto VD = dyn_cast<ValueDecl>(D);
3016
+ if (!VD)
3017
+ return ;
3021
3018
3022
- ASTContext &ctx = member ->getASTContext ();
3019
+ ASTContext &ctx = VD ->getASTContext ();
3023
3020
3024
- // Also skip overrides, unless they override an unavailable decl, which
3025
- // makes them not formally overrides anymore.
3026
- if (member ->getOverriddenDecl () &&
3027
- !member ->getOverriddenDecl ()->getAttrs ().isUnavailable (ctx))
3028
- continue ;
3021
+ // Also skip overrides, unless they override an unavailable decl, which
3022
+ // makes them not formally overrides anymore.
3023
+ if (VD ->getOverriddenDecl () &&
3024
+ !VD ->getOverriddenDecl ()->getAttrs ().isUnavailable (ctx))
3025
+ return ;
3029
3026
3030
- // Skip alternate Swift names for other language modes.
3031
- if (member->getAttrs ().isUnavailable (ctx))
3032
- continue ;
3027
+ // Skip alternate Swift names for other language modes.
3028
+ if (VD->getAttrs ().isUnavailable (ctx))
3029
+ return ;
3030
+
3031
+ // Skip async versions of members. We'll match against the completion
3032
+ // handler versions, hopping over to `getAsyncAlternative()` if needed.
3033
+ if (hasAsync (VD))
3034
+ return ;
3035
+
3036
+ auto inserted = unmatchedRequirements.insert (VD);
3037
+ assert (inserted && " objc interface member added twice?" );
3038
+ }
3039
+
3040
+ void addCandidate (Decl *D) {
3041
+ auto VD = dyn_cast<ValueDecl>(D);
3042
+ if (!VD || isa<DestructorDecl>(VD))
3043
+ return ;
3033
3044
3034
- // Skip async versions of members. We'll match against the completion
3035
- // handler versions, hopping over to `getAsyncAlternative()` if needed.
3036
- if (hasAsync (member))
3045
+ // `getExplicitObjCName()` is O(N) and would otherwise be used repeatedly
3046
+ // in `matchRequirementsAtThreshold()`, so just precompute it.
3047
+ auto inserted =
3048
+ unmatchedCandidates.insert ({ VD, getExplicitObjCName (VD) });
3049
+ assert (inserted.second && " member implementation added twice?" );
3050
+ }
3051
+
3052
+ void addRequirements (IterableDeclContext *idc) {
3053
+ assert (idc->getDecl ()->hasClangNode ());
3054
+ for (Decl *member : idc->getMembers ()) {
3055
+ // Skip accessors; we'll match their storage instead.
3056
+ if (isa<AccessorDecl>(member))
3037
3057
continue ;
3038
3058
3039
- auto inserted = unmatchedRequirements.insert (member);
3040
- assert (inserted && " objc interface member added twice?" );
3059
+ addRequirement (member);
3041
3060
}
3042
3061
}
3043
3062
3044
3063
void addCandidates (ExtensionDecl *ext) {
3045
3064
assert (ext->isObjCImplementation ());
3046
- for (Decl *_member : ext->getMembers ()) {
3065
+ for (Decl *member : ext->getMembers ()) {
3047
3066
// Skip accessors; we'll match their storage instead.
3048
- auto member = dyn_cast<ValueDecl>(_member);
3049
- if (!member || isa<AccessorDecl>(member) || isa<DestructorDecl>(member))
3067
+ if (isa<AccessorDecl>(member))
3050
3068
continue ;
3051
3069
3052
- // Skip non-member implementations.
3053
- // FIXME: Should we consider them if they were only rejected for privacy?
3054
- if (!member->isObjCMemberImplementation ()) {
3055
- // No member of an `@_objcImplementation` extension should need a vtable
3056
- // entry.
3057
- diagnoseVTableUse (member);
3058
- continue ;
3070
+ if (auto VD = dyn_cast<ValueDecl>(member)) {
3071
+ // Skip non-member implementations.
3072
+ // FIXME: Should we consider them if only rejected for access level?
3073
+ if (!VD->isObjCMemberImplementation ()) {
3074
+ // No member of an `@_objcImplementation` extension should need a
3075
+ // vtable entry.
3076
+ diagnoseVTableUse (VD);
3077
+ continue ;
3078
+ }
3059
3079
}
3060
3080
3061
- // `getExplicitObjCName()` is O(N) and would otherwise be used repeatedly
3062
- // in `matchRequirementsAtThreshold()`, so just precompute it.
3063
- auto inserted =
3064
- unmatchedCandidates.insert ({ member, getExplicitObjCName (member) });
3065
- assert (inserted.second && " member implementation added twice?" );
3066
-
3081
+ addCandidate (member);
3067
3082
}
3068
3083
}
3069
3084
0 commit comments