@@ -70,18 +70,9 @@ void ConformanceLookupTable::ConformanceEntry::markSupersededBy(
7070 SupersededBy = entry;
7171
7272 if (diagnose) {
73- // If an unavailable Sendable conformance is superseded by a
74- // retroactive one in the client, we need to record this error
75- // at the client decl context.
76- auto *dc = getDeclContext ();
77- if (getProtocol ()->isMarkerProtocol () && isFixed () &&
78- !entry->isFixed ()) {
79- dc = entry->getDeclContext ();
80- }
81-
8273 // Record the problem in the conformance table. We'll
8374 // diagnose these in semantic analysis.
84- table.AllSupersededDiagnostics [dc ].push_back (this );
75+ table.AllSupersededDiagnostics [getDeclContext () ].push_back (this );
8576 }
8677}
8778
@@ -607,22 +598,21 @@ ConformanceLookupTable::Ordering ConformanceLookupTable::compareConformances(
607598 }
608599 }
609600
610- // If only one of the conformances is unconditionally available on the
611- // current deployment target, pick that one.
612- //
613- // FIXME: Conformance lookup should really depend on source location for
614- // this to be 100% correct.
615- // FIXME: When a class and an extension with the same availability declare the
616- // same conformance, this silently takes the class and drops the extension.
617- if (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext () !=
618- rhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()) {
619- // Diagnose conflicting marker protocol conformances that differ in
620- // un-availability.
621- diagnoseSuperseded = lhs->getProtocol ()->isMarkerProtocol ();
622-
623- return (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()
624- ? Ordering::Before
625- : Ordering::After);
601+ // Unavailable Sendable conformances cannot be replaced by available ones.
602+ if (!lhs->getProtocol ()->isMarkerProtocol ()) {
603+ // If only one of the conformances is unconditionally available on the
604+ // current deployment target, pick that one.
605+ //
606+ // FIXME: Conformance lookup should really depend on source location for
607+ // this to be 100% correct.
608+ // FIXME: When a class and an extension with the same availability declare the
609+ // same conformance, this silently takes the class and drops the extension.
610+ if (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext () !=
611+ rhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()) {
612+ return (lhs->getDeclContext ()->isAlwaysAvailableConformanceContext ()
613+ ? Ordering::Before
614+ : Ordering::After);
615+ }
626616 }
627617
628618 // 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