@@ -142,23 +142,29 @@ pub fn translate_args_with_cause<'tcx>( |
|
|
142 |
142 |
pub(super) fn specializes(tcx: TyCtxt<'_>, (impl1_def_id, impl2_def_id): (DefId, DefId)) -> bool { |
143 |
143 |
// The feature gate should prevent introducing new specializations, but not |
144 |
144 |
// taking advantage of upstream ones. |
|
145 |
+// If specialization is enabled for this crate then no extra checks are needed. |
|
146 |
+// If it's not, and either of the `impl`s is local to this crate, then this definitely |
|
147 |
+// isn't specializing - unless specialization is enabled for the `impl` span, |
|
148 |
+// e.g. if it comes from an `allow_internal_unstable` macro |
145 |
149 |
let features = tcx.features(); |
146 |
150 |
let specialization_enabled = features.specialization | |
147 |
|
-if !specialization_enabled && impl1_def_id.is_local() { |
148 |
|
-let span = tcx.def_span(impl1_def_id); |
149 |
|
-if !span.allows_unstable(sym::specialization) |
150 |
|
- && !span.allows_unstable(sym::min_specialization) |
151 |
|
-{ |
152 |
|
-return false; |
|
151 |
+if !specialization_enabled { |
|
152 |
+if impl1_def_id.is_local() { |
|
153 |
+let span = tcx.def_span(impl1_def_id); |
|
154 |
+if !span.allows_unstable(sym::specialization) |
|
155 |
+ && !span.allows_unstable(sym::min_specialization) |
|
156 |
+{ |
|
157 |
+return false; |
|
158 |
+} |
153 |
159 |
} |
154 |
|
-} |
155 |
160 |
|
156 |
|
-if !specialization_enabled && impl2_def_id.is_local() { |
157 |
|
-let span = tcx.def_span(impl2_def_id); |
158 |
|
-if !span.allows_unstable(sym::specialization) |
159 |
|
- && !span.allows_unstable(sym::min_specialization) |
160 |
|
-{ |
161 |
|
-return false; |
|
161 |
+if impl2_def_id.is_local() { |
|
162 |
+let span = tcx.def_span(impl2_def_id); |
|
163 |
+if !span.allows_unstable(sym::specialization) |
|
164 |
+ && !span.allows_unstable(sym::min_specialization) |
|
165 |
+{ |
|
166 |
+return false; |
|
167 |
+} |
162 |
168 |
} |
163 |
169 |
} |
164 |
170 |
|