Implement fix for #67535
This commit is contained in:
parent
e11cb36c75
commit
4cb9030a66
4 changed files with 73 additions and 4 deletions
|
@ -53,7 +53,7 @@ fn do_orphan_check_impl<'tcx>(
|
|||
sp,
|
||||
item.span,
|
||||
tr.path.span,
|
||||
trait_ref.self_ty(),
|
||||
trait_ref,
|
||||
impl_.self_ty.span,
|
||||
&impl_.generics,
|
||||
err,
|
||||
|
@ -154,11 +154,12 @@ fn emit_orphan_check_error<'tcx>(
|
|||
sp: Span,
|
||||
full_impl_span: Span,
|
||||
trait_span: Span,
|
||||
self_ty: Ty<'tcx>,
|
||||
trait_ref: ty::TraitRef<'tcx>,
|
||||
self_ty_span: Span,
|
||||
generics: &hir::Generics<'tcx>,
|
||||
err: traits::OrphanCheckErr<'tcx>,
|
||||
) -> Result<!, ErrorGuaranteed> {
|
||||
let self_ty = trait_ref.self_ty();
|
||||
Err(match err {
|
||||
traits::OrphanCheckErr::NonLocalInputType(tys) => {
|
||||
let msg = match self_ty.kind() {
|
||||
|
@ -187,7 +188,14 @@ fn emit_orphan_check_error<'tcx>(
|
|||
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 this = |name: &str| {
|
||||
if !trait_ref.def_id.is_local() && !is_target_ty {
|
||||
msg("this", &format!(" because this is a foreign trait"))
|
||||
} else {
|
||||
msg("this", &format!(" because {name} are always foreign"))
|
||||
}
|
||||
};
|
||||
let msg = match &ty.kind() {
|
||||
ty::Slice(_) => this("slices"),
|
||||
ty::Array(..) => this("arrays"),
|
||||
|
|
22
src/test/ui/issues/issue-67535.rs
Normal file
22
src/test/ui/issues/issue-67535.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
fn main() {}
|
||||
|
||||
impl std::ops::AddAssign for () {
|
||||
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
|
||||
fn add_assign(&self, other: ()) -> () {
|
||||
()
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::AddAssign for [(); 1] {
|
||||
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
|
||||
fn add_assign(&self, other: [(); 1]) -> [(); 1] {
|
||||
[()]
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::AddAssign for &[u8] {
|
||||
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
|
||||
fn add_assign(&self, other: &[u8]) -> &[u8] {
|
||||
self
|
||||
}
|
||||
}
|
39
src/test/ui/issues/issue-67535.stderr
Normal file
39
src/test/ui/issues/issue-67535.stderr
Normal file
|
@ -0,0 +1,39 @@
|
|||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/issue-67535.rs:3:1
|
||||
|
|
||||
LL | impl std::ops::AddAssign for () {
|
||||
| ^^^^^-------------------^^^^^--
|
||||
| | | |
|
||||
| | | this is not defined in the current crate because tuples are always foreign
|
||||
| | this is not defined in the current crate because this is a foreign trait
|
||||
| impl doesn't use only types from inside the current crate
|
||||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/issue-67535.rs:10:1
|
||||
|
|
||||
LL | impl std::ops::AddAssign for [(); 1] {
|
||||
| ^^^^^-------------------^^^^^-------
|
||||
| | | |
|
||||
| | | this is not defined in the current crate because arrays are always foreign
|
||||
| | this is not defined in the current crate because this is a foreign trait
|
||||
| impl doesn't use only types from inside the current crate
|
||||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/issue-67535.rs:17:1
|
||||
|
|
||||
LL | impl std::ops::AddAssign for &[u8] {
|
||||
| ^^^^^-------------------^^^^^-----
|
||||
| | | |
|
||||
| | | this is not defined in the current crate because slices are always foreign
|
||||
| | this is not defined in the current crate because this is a foreign trait
|
||||
| impl doesn't use only types from inside the current crate
|
||||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
|
@ -10,7 +10,7 @@ use std::path::Path;
|
|||
const ENTRY_LIMIT: usize = 1000;
|
||||
// FIXME: The following limits should be reduced eventually.
|
||||
const ROOT_ENTRY_LIMIT: usize = 939;
|
||||
const ISSUES_ENTRY_LIMIT: usize = 2020;
|
||||
const ISSUES_ENTRY_LIMIT: usize = 2050;
|
||||
|
||||
fn check_entries(path: &Path, bad: &mut bool) {
|
||||
for dir in Walk::new(&path.join("test/ui")) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue