@@ -68,18 +68,9 @@ void ConformanceLookupTable::ConformanceEntry::markSupersededBy(
68
68
SupersededBy = entry;
69
69
70
70
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
-
80
71
// Record the problem in the conformance table. We'll
81
72
// diagnose these in semantic analysis.
82
- table.AllSupersededDiagnostics [dc ].push_back (this );
73
+ table.AllSupersededDiagnostics [getDeclContext () ].push_back (this );
83
74
}
84
75
}
85
76
@@ -605,22 +596,21 @@ ConformanceLookupTable::Ordering ConformanceLookupTable::compareConformances(
605
596
}
606
597
}
607
598
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
+ }
624
614
}
625
615
626
616
// If one entry is fixed and the other is not, we have our answer.
@@ -1138,17 +1128,9 @@ void ConformanceLookupTable::lookupConformances(
1138
1128
if (diagnostics) {
1139
1129
auto knownDiags = AllSupersededDiagnostics.find (dc);
1140
1130
if (knownDiags != AllSupersededDiagnostics.end ()) {
1141
- for (auto *entry : knownDiags->second ) {
1131
+ for (const auto *entry : knownDiags->second ) {
1142
1132
ConformanceEntry *supersededBy = entry->getSupersededBy ();
1143
1133
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
-
1152
1134
diagnostics->push_back ({entry->getProtocol (),
1153
1135
entry->getDeclaredLoc (),
1154
1136
entry->getKind (),
0 commit comments