Do not mention private Self types from other crates

This commit is contained in:
Michael Goulet 2022-07-09 18:39:51 +00:00
parent a51fb2ba82
commit f2d8af10c2
5 changed files with 67 additions and 3 deletions

View File

@ -1805,8 +1805,26 @@ 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.
match self.tcx.visibility(def.did()) {
ty::Visibility::Public => true,
ty::Visibility::Restricted(def_id) => def_id.is_local(),
ty::Visibility::Invisible => false,
}
} else {
true
}
})
.collect();
return report(normalized_impl_candidates, err);
}

View File

@ -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 {}

View File

@ -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 {}

View File

@ -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`.

View File

@ -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