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,
|
sp,
|
||||||
item.span,
|
item.span,
|
||||||
tr.path.span,
|
tr.path.span,
|
||||||
trait_ref.self_ty(),
|
trait_ref,
|
||||||
impl_.self_ty.span,
|
impl_.self_ty.span,
|
||||||
&impl_.generics,
|
&impl_.generics,
|
||||||
err,
|
err,
|
||||||
|
@ -154,11 +154,12 @@ fn emit_orphan_check_error<'tcx>(
|
||||||
sp: Span,
|
sp: Span,
|
||||||
full_impl_span: Span,
|
full_impl_span: Span,
|
||||||
trait_span: Span,
|
trait_span: Span,
|
||||||
self_ty: Ty<'tcx>,
|
trait_ref: ty::TraitRef<'tcx>,
|
||||||
self_ty_span: Span,
|
self_ty_span: Span,
|
||||||
generics: &hir::Generics<'tcx>,
|
generics: &hir::Generics<'tcx>,
|
||||||
err: traits::OrphanCheckErr<'tcx>,
|
err: traits::OrphanCheckErr<'tcx>,
|
||||||
) -> Result<!, ErrorGuaranteed> {
|
) -> Result<!, ErrorGuaranteed> {
|
||||||
|
let self_ty = trait_ref.self_ty();
|
||||||
Err(match err {
|
Err(match err {
|
||||||
traits::OrphanCheckErr::NonLocalInputType(tys) => {
|
traits::OrphanCheckErr::NonLocalInputType(tys) => {
|
||||||
let msg = match self_ty.kind() {
|
let msg = match self_ty.kind() {
|
||||||
|
@ -187,7 +188,14 @@ fn emit_orphan_check_error<'tcx>(
|
||||||
let msg = |ty: &str, postfix: &str| {
|
let msg = |ty: &str, postfix: &str| {
|
||||||
format!("{ty} is not defined in the current crate{postfix}")
|
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() {
|
let msg = match &ty.kind() {
|
||||||
ty::Slice(_) => this("slices"),
|
ty::Slice(_) => this("slices"),
|
||||||
ty::Array(..) => this("arrays"),
|
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;
|
const ENTRY_LIMIT: usize = 1000;
|
||||||
// FIXME: The following limits should be reduced eventually.
|
// FIXME: The following limits should be reduced eventually.
|
||||||
const ROOT_ENTRY_LIMIT: usize = 939;
|
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) {
|
fn check_entries(path: &Path, bad: &mut bool) {
|
||||||
for dir in Walk::new(&path.join("test/ui")) {
|
for dir in Walk::new(&path.join("test/ui")) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue