@@ -68,18 +68,9 @@ void ConformanceLookupTable::ConformanceEntry::markSupersededBy(
6868 SupersededBy = entry;
6969
7070 if (diagnose) {
71- // If an unavailable Sendable conformance is superseded by a
72- // retroactive one in the client, we need to record this error
73- // at the client decl context.
74- auto *dc = getDeclContext ();
75- if (getProtocol ()->isMarkerProtocol () && isFixed () &&
76- !entry->isFixed ()) {
77- dc = entry->getDeclContext ();
78- }
79-
8071 // Record the problem in the conformance table. We'll
8172 // diagnose these in semantic analysis.
82- table.AllSupersededDiagnostics [dc ].push_back (this );
73+ table.AllSupersededDiagnostics [getDeclContext () ].push_back (this );
8374 }
8475}
8576
@@ -605,22 +596,21 @@ ConformanceLookupTable::Ordering ConformanceLookupTable::compareConformances(
605596 }
606597 }
607598
608- // If only one of the conformances is unconditionally available on the
609- // current deployment target, pick that one.
610- //
611- // FIXME: Conformance lookup should really depend on source location for
612- // this to be 100% correct.
613- // FIXME: When a class and an extension with the same availability declare the
614- // same conformance, this silently takes the class and drops the extension.
615- if (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext () !=
616- rhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()) {
617- // Diagnose conflicting marker protocol conformances that differ in
618- // un-availability.
619- diagnoseSuperseded = lhs->getProtocol ()->isMarkerProtocol ();
620-
621- return (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()
622- ? Ordering::Before
623- : Ordering::After);
599+ // Unavailable Sendable conformances cannot be replaced by available ones.
600+ if (!lhs->getProtocol ()->isMarkerProtocol ()) {
601+ // If only one of the conformances is unconditionally available on the
602+ // current deployment target, pick that one.
603+ //
604+ // FIXME: Conformance lookup should really depend on source location for
605+ // this to be 100% correct.
606+ // FIXME: When a class and an extension with the same availability declare the
607+ // same conformance, this silently takes the class and drops the extension.
608+ if (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext () !=
609+ rhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()) {
610+ return (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()
611+ ? Ordering::Before
612+ : Ordering::After);
613+ }
624614 }
625615
626616 // If one entry is fixed and the other is not, we have our answer.
@@ -1138,17 +1128,9 @@ void ConformanceLookupTable::lookupConformances(
11381128 if (diagnostics) {
11391129 auto knownDiags = AllSupersededDiagnostics.find (dc);
11401130 if (knownDiags != AllSupersededDiagnostics.end ()) {
1141- for (auto *entry : knownDiags->second ) {
1131+ for (const auto *entry : knownDiags->second ) {
11421132 ConformanceEntry *supersededBy = entry->getSupersededBy ();
11431133
1144- // Diagnose the client conformance as superseded.
1145- auto *definingModule = nominal->getParentModule ();
1146- if (entry->getDeclContext ()->getParentModule () == definingModule &&
1147- supersededBy->getDeclContext ()->getParentModule () != definingModule) {
1148- supersededBy = entry;
1149- entry = entry->getSupersededBy ();
1150- }
1151-
11521134 diagnostics->push_back ({entry->getProtocol (),
11531135 entry->getDeclaredLoc (),
11541136 entry->getKind (),
0 commit comments