Give opaque types a better coherence error
This commit is contained in:
parent
1d12c3cea3
commit
a9af75cdbc
2 changed files with 16 additions and 9 deletions
|
@ -184,11 +184,19 @@ fn emit_orphan_check_error<'tcx>(
|
||||||
ty::Adt(def, _) => tcx.mk_adt(*def, ty::List::empty()),
|
ty::Adt(def, _) => tcx.mk_adt(*def, ty::List::empty()),
|
||||||
_ => ty,
|
_ => ty,
|
||||||
};
|
};
|
||||||
let this = "this".to_string();
|
let msg = |ty: &str, postfix: &str| {
|
||||||
let (ty, postfix) = match &ty.kind() {
|
format!("{ty} is not defined in the current crate{postfix}")
|
||||||
ty::Slice(_) => (this, " because slices are always foreign"),
|
};
|
||||||
ty::Array(..) => (this, " because arrays are always foreign"),
|
let this = |name: &str| msg("this", &format!(" because {name} are always foreign"));
|
||||||
ty::Tuple(..) => (this, " because tuples are always foreign"),
|
let msg = match &ty.kind() {
|
||||||
|
ty::Slice(_) => this("slices"),
|
||||||
|
ty::Array(..) => this("arrays"),
|
||||||
|
ty::Tuple(..) => this("tuples"),
|
||||||
|
ty::Alias(ty::Opaque, ..) => {
|
||||||
|
"type alias impl trait is treated as if it were foreign, \
|
||||||
|
because its hidden type could be from a foreign crate"
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
ty::RawPtr(ptr_ty) => {
|
ty::RawPtr(ptr_ty) => {
|
||||||
emit_newtype_suggestion_for_raw_ptr(
|
emit_newtype_suggestion_for_raw_ptr(
|
||||||
full_impl_span,
|
full_impl_span,
|
||||||
|
@ -198,12 +206,11 @@ fn emit_orphan_check_error<'tcx>(
|
||||||
&mut err,
|
&mut err,
|
||||||
);
|
);
|
||||||
|
|
||||||
(format!("`{}`", ty), " because raw pointers are always foreign")
|
msg(&format!("`{ty}`"), " because raw pointers are always foreign")
|
||||||
}
|
}
|
||||||
_ => (format!("`{}`", ty), ""),
|
_ => msg(&format!("`{ty}`"), ""),
|
||||||
};
|
};
|
||||||
|
|
||||||
let msg = format!("{} is not defined in the current crate{}", ty, postfix);
|
|
||||||
if is_target_ty {
|
if is_target_ty {
|
||||||
// Point at `D<A>` in `impl<A, B> for C<B> in D<A>`
|
// Point at `D<A>` in `impl<A, B> for C<B> in D<A>`
|
||||||
err.span_label(self_ty_span, &msg);
|
err.span_label(self_ty_span, &msg);
|
||||||
|
|
|
@ -4,7 +4,7 @@ error[E0117]: only traits defined in the current crate can be implemented for ar
|
||||||
LL | impl<T> foreign_crate::ForeignTrait for AliasOfForeignType<T> {}
|
LL | impl<T> foreign_crate::ForeignTrait for AliasOfForeignType<T> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---------------------
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---------------------
|
||||||
| | |
|
| | |
|
||||||
| | `AliasOfForeignType<T>` is not defined in the current crate
|
| | type alias impl trait is treated as if it were foreign, because its hidden type could be from a foreign crate
|
||||||
| impl doesn't use only types from inside the current crate
|
| impl doesn't use only types from inside the current crate
|
||||||
|
|
|
|
||||||
= note: define and implement a trait or new type instead
|
= note: define and implement a trait or new type instead
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue