Skip to content

Commit

Permalink
Rollup merge of #99091 - compiler-errors:private-types-should-stay-pr…
Browse files Browse the repository at this point in the history
…ivate, r=lcnr

Do not mention private types from other crates as impl candidates

Fixes #99080
  • Loading branch information
Dylan-DPC committed Jul 11, 2022
2 parents 92b8adf + 913023b commit 93f71d4
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 3 deletions.
24 changes: 22 additions & 2 deletions compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
if !self.report_similar_impl_candidates(
impl_candidates,
trait_ref,
obligation.cause.body_id,
&mut err,
) {
// This is *almost* equivalent to
Expand Down Expand Up @@ -707,6 +708,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
self.report_similar_impl_candidates(
impl_candidates,
trait_ref,
obligation.cause.body_id,
&mut err,
);
}
Expand Down Expand Up @@ -1353,6 +1355,7 @@ trait InferCtxtPrivExt<'hir, 'tcx> {
&self,
impl_candidates: Vec<ImplCandidate<'tcx>>,
trait_ref: ty::PolyTraitRef<'tcx>,
body_id: hir::HirId,
err: &mut Diagnostic,
) -> bool;

Expand Down Expand Up @@ -1735,6 +1738,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
&self,
impl_candidates: Vec<ImplCandidate<'tcx>>,
trait_ref: ty::PolyTraitRef<'tcx>,
body_id: hir::HirId,
err: &mut Diagnostic,
) -> bool {
let report = |mut candidates: Vec<TraitRef<'tcx>>, err: &mut Diagnostic| {
Expand Down Expand Up @@ -1805,8 +1809,24 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
|| self.tcx.is_builtin_derive(def_id)
})
.filter_map(|def_id| self.tcx.impl_trait_ref(def_id))
// Avoid mentioning type parameters.
.filter(|trait_ref| !matches!(trait_ref.self_ty().kind(), ty::Param(_)))
.filter(|trait_ref| {
let self_ty = trait_ref.self_ty();
// Avoid mentioning type parameters.
if let ty::Param(_) = self_ty.kind() {
false
}
// Avoid mentioning types that are private to another crate
else if let ty::Adt(def, _) = self_ty.peel_refs().kind() {
// FIXME(compiler-errors): This could be generalized, both to
// be more granular, and probably look past other `#[fundamental]`
// types, too.
self.tcx
.visibility(def.did())
.is_accessible_from(body_id.owner.to_def_id(), self.tcx)
} else {
true
}
})
.collect();
return report(normalized_impl_candidates, err);
}
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/suggestions/auxiliary/meow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
pub trait Meow {
fn meow(&self) {}
}

pub struct GlobalMeow;

impl Meow for GlobalMeow {}

pub(crate) struct PrivateMeow;

impl Meow for PrivateMeow {}
16 changes: 16 additions & 0 deletions src/test/ui/suggestions/issue-99080.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// aux-build:meow.rs

extern crate meow;

use meow::Meow;

fn needs_meow<T: Meow>(t: T) {}

fn main() {
needs_meow(1usize);
//~^ ERROR the trait bound `usize: Meow` is not satisfied
}

struct LocalMeow;

impl Meow for LocalMeow {}
20 changes: 20 additions & 0 deletions src/test/ui/suggestions/issue-99080.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error[E0277]: the trait bound `usize: Meow` is not satisfied
--> $DIR/issue-99080.rs:10:16
|
LL | needs_meow(1usize);
| ---------- ^^^^^^ the trait `Meow` is not implemented for `usize`
| |
| required by a bound introduced by this call
|
= help: the following other types implement trait `Meow`:
GlobalMeow
LocalMeow
note: required by a bound in `needs_meow`
--> $DIR/issue-99080.rs:7:18
|
LL | fn needs_meow<T: Meow>(t: T) {}
| ^^^^ required by this bound in `needs_meow`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ LL | s.strip_suffix(b'\n').unwrap_or(s)
&'c &'b str
[char; N]
char
pattern::MultiCharEqPattern<C>
= note: required because of the requirements on the impl of `Pattern<'_>` for `u8`

error: aborting due to previous error
Expand Down

0 comments on commit 93f71d4

Please sign in to comment.