Skip to content

Commit

Permalink
Rollup merge of rust-lang#106010 - oli-obk:tait_coherence_diagnostic,…
Browse files Browse the repository at this point in the history
… r=compiler-errors

Give opaque types a better coherence error
  • Loading branch information
matthiaskrgr committed Dec 22, 2022
2 parents 68cc597 + a9af75c commit d5983c5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
23 changes: 15 additions & 8 deletions compiler/rustc_hir_analysis/src/coherence/orphan.rs
Expand Up @@ -184,11 +184,19 @@ fn emit_orphan_check_error<'tcx>(
ty::Adt(def, _) => tcx.mk_adt(*def, ty::List::empty()),
_ => ty,
};
let this = "this".to_string();
let (ty, postfix) = match &ty.kind() {
ty::Slice(_) => (this, " because slices are always foreign"),
ty::Array(..) => (this, " because arrays are always foreign"),
ty::Tuple(..) => (this, " because tuples are always foreign"),
let msg = |ty: &str, postfix: &str| {
format!("{ty} is not defined in the current crate{postfix}")
};
let this = |name: &str| msg("this", &format!(" because {name} 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) => {
emit_newtype_suggestion_for_raw_ptr(
full_impl_span,
Expand All @@ -198,12 +206,11 @@ fn emit_orphan_check_error<'tcx>(
&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 {
// Point at `D<A>` in `impl<A, B> for C<B> in D<A>`
err.span_label(self_ty_span, &msg);
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/type-alias-impl-trait/coherence.stderr
Expand Up @@ -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> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---------------------
| | |
| | `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
|
= note: define and implement a trait or new type instead
Expand Down

0 comments on commit d5983c5

Please sign in to comment.