@@ -4388,10 +4388,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
4388
4388
//
4389
4389
// Treat 'unavailable' implicitly as if it were 'optional'.
4390
4390
// The compiler will reject actual uses.
4391
- auto Attrs = requirement->getAttrs ();
4392
- if (Attrs.hasAttribute <OptionalAttr>() ||
4393
- Attrs.isUnavailable (getASTContext ()) ||
4394
- !shouldRecordMissingWitness (Proto, Conformance, requirement)) {
4391
+ if (allowOptionalWitness (requirement)) {
4395
4392
return ResolveWitnessResult::Missing;
4396
4393
}
4397
4394
@@ -4564,11 +4561,7 @@ ResolveWitnessResult ConformanceChecker::resolveWitnessViaDefault(
4564
4561
ValueDecl *requirement) {
4565
4562
assert (!isa<AssociatedTypeDecl>(requirement) && " Use resolveTypeWitnessVia*" );
4566
4563
4567
- // An optional requirement is trivially satisfied with an empty requirement.
4568
- // An 'unavailable' requirement is treated like an optional requirement.
4569
- auto Attrs = requirement->getAttrs ();
4570
- if (Attrs.hasAttribute <OptionalAttr>() ||
4571
- Attrs.isUnavailable (getASTContext ())) {
4564
+ if (allowOptionalWitness (requirement)) {
4572
4565
recordOptionalWitness (requirement);
4573
4566
return ResolveWitnessResult::Success;
4574
4567
}
@@ -4639,6 +4632,25 @@ void ConformanceChecker::resolveSingleWitness(ValueDecl *requirement) {
4639
4632
}
4640
4633
}
4641
4634
4635
+ bool ConformanceChecker::allowOptionalWitness (ValueDecl *requirement) {
4636
+ auto Attrs = requirement->getAttrs ();
4637
+
4638
+ // An optional requirement is trivially satisfied with an empty requirement.
4639
+ if (Attrs.hasAttribute <OptionalAttr>())
4640
+ return true ;
4641
+
4642
+ // An 'unavailable' requirement is treated like an optional requirement.
4643
+ if (Attrs.isUnavailable (getASTContext ()))
4644
+ return true ;
4645
+
4646
+ // A requirement with a satisfied Obj-C alternative requirement is effectively
4647
+ // optional.
4648
+ if (!shouldRecordMissingWitness (Proto, Conformance, requirement))
4649
+ return true ;
4650
+
4651
+ return false ;
4652
+ }
4653
+
4642
4654
// / FIXME: It feels like this could be part of findExistentialSelfReferences().
4643
4655
static std::optional<Requirement>
4644
4656
hasInvariantSelfRequirement (const ProtocolDecl *proto,
0 commit comments