1
Fork 0

Implement fix for #67535

This commit is contained in:
Troy Neubauer 2023-01-01 18:08:02 -08:00
parent e11cb36c75
commit 4cb9030a66
No known key found for this signature in database
GPG key ID: A9D84D8573C7AA85
4 changed files with 73 additions and 4 deletions

View file

@ -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"),

View 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
}
}

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

View file

@ -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")) {