Auto merge of #89550 - lcnr:coherence-specialization, r=nikomatsakis
do not emit overlap errors for impls failing the orphan check this should finally allow us to merge #86986, see https://github.com/rust-lang/rust/pull/86986#discussion_r716059345 for more details. r? `@nikomatsakis` cc `@eddyb`
This commit is contained in:
commit
1d34cb4efc
28 changed files with 511 additions and 507 deletions
|
|
@ -6,9 +6,7 @@
|
|||
extern crate trait_impl_conflict;
|
||||
use trait_impl_conflict::Foo;
|
||||
|
||||
impl<A> Foo for A {
|
||||
//~^ ERROR E0119
|
||||
//~| ERROR E0210
|
||||
impl<A> Foo for A { //~ ERROR E0210
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `trait_impl_conflict::Foo` for type `isize`
|
||||
--> $DIR/coherence-cross-crate-conflict.rs:9:1
|
||||
|
|
||||
LL | impl<A> Foo for A {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `trait_impl_conflict`:
|
||||
- impl Foo for isize;
|
||||
|
||||
error[E0210]: type parameter `A` must be used as the type parameter for some local type (e.g., `MyStruct<A>`)
|
||||
--> $DIR/coherence-cross-crate-conflict.rs:9:6
|
||||
|
|
||||
|
|
@ -16,7 +7,6 @@ LL | impl<A> Foo for A {
|
|||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
Some errors have detailed explanations: E0119, E0210.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
||||
For more information about this error, try `rustc --explain E0210`.
|
||||
|
|
|
|||
|
|
@ -1,15 +1,3 @@
|
|||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:15:1
|
||||
|
|
||||
LL | impl !Marker1 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:17:1
|
||||
|
|
||||
LL | impl !Marker2 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:23:1
|
||||
|
|
||||
|
|
@ -33,6 +21,18 @@ error[E0321]: cross-crate traits with a default impl, like `Send`, can only be i
|
|||
LL | impl !Send for dyn Object + Marker2 {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:15:1
|
||||
|
|
||||
LL | impl !Marker1 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:17:1
|
||||
|
|
||||
LL | impl !Marker2 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0321, E0371.
|
||||
|
|
|
|||
|
|
@ -1,15 +1,3 @@
|
|||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:15:1
|
||||
|
|
||||
LL | impl Marker1 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:17:1
|
||||
|
|
||||
LL | impl Marker2 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:23:1
|
||||
|
|
||||
|
|
@ -33,6 +21,18 @@ error[E0321]: cross-crate traits with a default impl, like `Send`, can only be i
|
|||
LL | unsafe impl Send for dyn Object + Marker2 {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:15:1
|
||||
|
|
||||
LL | impl Marker1 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
|
||||
|
||||
error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
|
||||
--> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:17:1
|
||||
|
|
||||
LL | impl Marker2 for dyn Object + Marker2 { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0321, E0371.
|
||||
|
|
|
|||
|
|
@ -3,8 +3,7 @@
|
|||
use std::marker::Copy;
|
||||
|
||||
impl Copy for i32 {}
|
||||
//~^ ERROR E0119
|
||||
//~| ERROR E0117
|
||||
//~^ ERROR E0117
|
||||
enum TestE {
|
||||
A
|
||||
}
|
||||
|
|
@ -32,7 +31,6 @@ impl Copy for [MyType] {}
|
|||
//~^ ERROR E0206
|
||||
//~| ERROR E0117
|
||||
impl Copy for &'static [NotSync] {}
|
||||
//~^ ERROR E0119
|
||||
//~| ERROR E0117
|
||||
//~^ ERROR E0117
|
||||
fn main() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,50 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `i32`
|
||||
--> $DIR/coherence-impls-copy.rs:5:1
|
||||
|
|
||||
LL | impl Copy for i32 {}
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl Copy for i32;
|
||||
|
||||
error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `&NotSync`
|
||||
--> $DIR/coherence-impls-copy.rs:29:1
|
||||
|
|
||||
LL | impl Copy for &'static NotSync {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<T> Copy for &T
|
||||
where T: ?Sized;
|
||||
|
||||
error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `&[NotSync]`
|
||||
--> $DIR/coherence-impls-copy.rs:34:1
|
||||
|
|
||||
LL | impl Copy for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<T> Copy for &T
|
||||
where T: ?Sized;
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:22:15
|
||||
|
|
||||
LL | impl Copy for &'static mut MyType {}
|
||||
| ^^^^^^^^^^^^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:26:15
|
||||
|
|
||||
LL | impl Copy for (MyType, MyType) {}
|
||||
| ^^^^^^^^^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:31:15
|
||||
|
|
||||
LL | impl Copy for [MyType] {}
|
||||
| ^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impls-copy.rs:5:1
|
||||
|
|
||||
|
|
@ -57,7 +10,7 @@ LL | impl Copy for i32 {}
|
|||
= 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/coherence-impls-copy.rs:26:1
|
||||
--> $DIR/coherence-impls-copy.rs:25:1
|
||||
|
|
||||
LL | impl Copy for (MyType, MyType) {}
|
||||
| ^^^^^^^^^^^^^^----------------
|
||||
|
|
@ -68,7 +21,7 @@ LL | impl Copy for (MyType, MyType) {}
|
|||
= 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/coherence-impls-copy.rs:31:1
|
||||
--> $DIR/coherence-impls-copy.rs:30:1
|
||||
|
|
||||
LL | impl Copy for [MyType] {}
|
||||
| ^^^^^^^^^^^^^^--------
|
||||
|
|
@ -79,7 +32,7 @@ LL | impl Copy for [MyType] {}
|
|||
= 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/coherence-impls-copy.rs:34:1
|
||||
--> $DIR/coherence-impls-copy.rs:33:1
|
||||
|
|
||||
LL | impl Copy for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^------------------
|
||||
|
|
@ -89,7 +42,35 @@ LL | impl Copy for &'static [NotSync] {}
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `&NotSync`
|
||||
--> $DIR/coherence-impls-copy.rs:28:1
|
||||
|
|
||||
LL | impl Copy for &'static NotSync {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<T> Copy for &T
|
||||
where T: ?Sized;
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:21:15
|
||||
|
|
||||
LL | impl Copy for &'static mut MyType {}
|
||||
| ^^^^^^^^^^^^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:25:15
|
||||
|
|
||||
LL | impl Copy for (MyType, MyType) {}
|
||||
| ^^^^^^^^^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error[E0206]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/coherence-impls-copy.rs:30:15
|
||||
|
|
||||
LL | impl Copy for [MyType] {}
|
||||
| ^^^^^^^^ type is not a structure or enumeration
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0119, E0206.
|
||||
For more information about an error, try `rustc --explain E0117`.
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ unsafe impl Send for [MyType] {}
|
|||
//~^ ERROR E0117
|
||||
|
||||
unsafe impl Send for &'static [NotSync] {}
|
||||
//~^ ERROR conflicting implementations of trait
|
||||
//~| ERROR only traits defined in the current crate
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::marker::Send` for type `&[NotSync]`
|
||||
--> $DIR/coherence-impls-send.rs:25:1
|
||||
|
|
||||
LL | unsafe impl Send for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<T> Send for &T
|
||||
where T: Sync, T: ?Sized;
|
||||
= note: upstream crates may add a new impl of trait `std::marker::Sync` for type `[NotSync]` in future versions
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impls-send.rs:16:1
|
||||
|
|
||||
|
|
@ -48,7 +37,7 @@ LL | unsafe impl Send for &'static [NotSync] {}
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0119, E0321.
|
||||
Some errors have detailed explanations: E0117, E0321.
|
||||
For more information about an error, try `rustc --explain E0117`.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,36 @@
|
|||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impls-sized.rs:20:1
|
||||
|
|
||||
LL | impl Sized for (MyType, MyType) {}
|
||||
| ^^^^^^^^^^^^^^^----------------
|
||||
| | |
|
||||
| | this is not defined in the current crate because tuples are always foreign
|
||||
| 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/coherence-impls-sized.rs:27:1
|
||||
|
|
||||
LL | impl Sized for [MyType] {}
|
||||
| ^^^^^^^^^^^^^^^--------
|
||||
| | |
|
||||
| | this is not defined in the current crate because slices are always foreign
|
||||
| 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/coherence-impls-sized.rs:31:1
|
||||
|
|
||||
LL | impl Sized for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^^------------------
|
||||
| | |
|
||||
| | this is not defined in the current crate because slices are always foreign
|
||||
| impl doesn't use only types from inside the current crate
|
||||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0322]: explicit impls for the `Sized` trait are not permitted
|
||||
--> $DIR/coherence-impls-sized.rs:14:1
|
||||
|
|
||||
|
|
@ -34,39 +67,6 @@ error[E0322]: explicit impls for the `Sized` trait are not permitted
|
|||
LL | impl Sized for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl of 'Sized' not allowed
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-impls-sized.rs:20:1
|
||||
|
|
||||
LL | impl Sized for (MyType, MyType) {}
|
||||
| ^^^^^^^^^^^^^^^----------------
|
||||
| | |
|
||||
| | this is not defined in the current crate because tuples are always foreign
|
||||
| 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/coherence-impls-sized.rs:27:1
|
||||
|
|
||||
LL | impl Sized for [MyType] {}
|
||||
| ^^^^^^^^^^^^^^^--------
|
||||
| | |
|
||||
| | this is not defined in the current crate because slices are always foreign
|
||||
| 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/coherence-impls-sized.rs:31:1
|
||||
|
|
||||
LL | impl Sized for &'static [NotSync] {}
|
||||
| ^^^^^^^^^^^^^^^------------------
|
||||
| | |
|
||||
| | this is not defined in the current crate because slices are always foreign
|
||||
| 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 9 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0322.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,14 @@
|
|||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/coherence-orphan.rs:17:1
|
||||
|
|
||||
LL | impl !Send for Vec<isize> { }
|
||||
| ^^^^^^^^^^^^^^^----------
|
||||
| | |
|
||||
| | `Vec` is not defined in the current crate
|
||||
| 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/coherence-orphan.rs:10:1
|
||||
|
|
||||
|
|
@ -10,17 +21,6 @@ LL | impl TheTrait<usize> for isize { }
|
|||
|
|
||||
= 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/coherence-orphan.rs:17:1
|
||||
|
|
||||
LL | impl !Send for Vec<isize> { }
|
||||
| ^^^^^^^^^^^^^^^----------
|
||||
| | |
|
||||
| | `Vec` is not defined in the current crate
|
||||
| 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 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
||||
|
|
|
|||
|
|
@ -4,12 +4,6 @@ error[E0412]: cannot find type `Nonexistent` in this scope
|
|||
LL | impl Drop for Nonexistent {
|
||||
| ^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/drop-on-non-struct.rs:1:19
|
||||
|
|
||||
LL | impl<'a> Drop for &'a mut isize {
|
||||
| ^^^^^^^^^^^^^ must be a struct, enum, or union
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/drop-on-non-struct.rs:1:1
|
||||
|
|
||||
|
|
@ -21,6 +15,12 @@ LL | impl<'a> Drop for &'a mut isize {
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/drop-on-non-struct.rs:1:19
|
||||
|
|
||||
LL | impl<'a> Drop for &'a mut isize {
|
||||
| ^^^^^^^^^^^^^ must be a struct, enum, or union
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0120, E0412.
|
||||
|
|
|
|||
|
|
@ -1,9 +1,3 @@
|
|||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/E0117.rs:1:15
|
||||
|
|
||||
LL | impl Drop for u32 {}
|
||||
| ^^^ must be a struct, enum, or union
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/E0117.rs:1:1
|
||||
|
|
||||
|
|
@ -15,6 +9,12 @@ LL | impl Drop for u32 {}
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/E0117.rs:1:15
|
||||
|
|
||||
LL | impl Drop for u32 {}
|
||||
| ^^^ must be a struct, enum, or union
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0120.
|
||||
|
|
|
|||
|
|
@ -7,6 +7,5 @@ use complex_impl_support::{External, M};
|
|||
struct Q;
|
||||
|
||||
impl<R> External for (Q, R) {} //~ ERROR only traits defined
|
||||
//~^ ERROR conflicting implementations of trait
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `complex_impl_support::External` for type `(Q, complex_impl_support::M<'_, '_, '_, std::boxed::Box<_>, _, _>)`
|
||||
--> $DIR/complex-impl.rs:9:1
|
||||
|
|
||||
LL | impl<R> External for (Q, R) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `complex_impl_support`:
|
||||
- impl<'a, 'b, 'c, T, U, V, W> External for (T, M<'a, 'b, 'c, Box<U>, V, W>)
|
||||
where <U as FnOnce<(T,)>>::Output == V, <V as Iterator>::Item == T, 'b: 'a, T: 'a, U: 'static, U: FnOnce<(T,)>, V: Iterator, V: Clone, W: Add, <W as Add>::Output: Copy;
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/complex-impl.rs:9:1
|
||||
|
|
||||
|
|
@ -19,7 +9,6 @@ LL | impl<R> External for (Q, R) {}
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
Some errors have detailed explanations: E0117, E0119.
|
||||
For more information about an error, try `rustc --explain E0117`.
|
||||
For more information about this error, try `rustc --explain E0117`.
|
||||
|
|
|
|||
|
|
@ -3,6 +3,5 @@ use std::ops::Deref;
|
|||
struct Foo;
|
||||
|
||||
impl<Foo> Deref for Foo { } //~ ERROR must be used
|
||||
//~^ ERROR conflicting implementations
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::ops::Deref` for type `&_`
|
||||
--> $DIR/issue-28981.rs:5:1
|
||||
|
|
||||
LL | impl<Foo> Deref for Foo { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<T> Deref for &T
|
||||
where T: ?Sized;
|
||||
|
||||
error[E0210]: type parameter `Foo` must be used as the type parameter for some local type (e.g., `MyStruct<Foo>`)
|
||||
--> $DIR/issue-28981.rs:5:6
|
||||
|
|
||||
|
|
@ -17,7 +7,6 @@ LL | impl<Foo> Deref for Foo { }
|
|||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
Some errors have detailed explanations: E0119, E0210.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
||||
For more information about this error, try `rustc --explain E0210`.
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ struct Flags;
|
|||
trait A {
|
||||
}
|
||||
|
||||
impl<T> Drop for T where T: A { //~ ERROR E0119
|
||||
//~^ ERROR E0120
|
||||
//~| ERROR E0210
|
||||
impl<T> Drop for T where T: A {
|
||||
//~^ ERROR E0120
|
||||
//~| ERROR E0210
|
||||
fn drop(&mut self) {
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,20 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::ops::Drop` for type `std::boxed::Box<_, _>`
|
||||
--> $DIR/issue-41974.rs:7:1
|
||||
|
|
||||
LL | impl<T> Drop for T where T: A {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `alloc`:
|
||||
- impl<T, A> Drop for Box<T, A>
|
||||
where A: Allocator, T: ?Sized;
|
||||
= note: downstream crates may implement trait `A` for type `std::boxed::Box<_, _>`
|
||||
|
||||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/issue-41974.rs:7:18
|
||||
|
|
||||
LL | impl<T> Drop for T where T: A {
|
||||
| ^ must be a struct, enum, or union
|
||||
|
||||
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
|
||||
--> $DIR/issue-41974.rs:7:6
|
||||
|
|
||||
|
|
@ -24,7 +7,13 @@ LL | impl<T> Drop for T where T: A {
|
|||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
|
||||
--> $DIR/issue-41974.rs:7:18
|
||||
|
|
||||
LL | impl<T> Drop for T where T: A {
|
||||
| ^ must be a struct, enum, or union
|
||||
|
||||
Some errors have detailed explanations: E0119, E0120, E0210.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0120, E0210.
|
||||
For more information about an error, try `rustc --explain E0120`.
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
|
||||
pub struct Int(i32);
|
||||
|
||||
impl const std::ops::Add for i32 {
|
||||
//~^ ERROR conflicting implementations of trait
|
||||
//~| ERROR only traits defined in the current crate can be implemented for arbitrary types
|
||||
impl const std::ops::Add for i32 { //~ ERROR type annotations needed
|
||||
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
|
||||
type Output = Self;
|
||||
|
||||
fn add(self, rhs: Self) -> Self {
|
||||
|
|
@ -12,7 +11,7 @@ impl const std::ops::Add for i32 {
|
|||
}
|
||||
}
|
||||
|
||||
impl std::ops::Add for Int {
|
||||
impl std::ops::Add for Int { //~ ERROR type annotations needed
|
||||
type Output = Self;
|
||||
|
||||
fn add(self, rhs: Self) -> Self {
|
||||
|
|
@ -20,7 +19,7 @@ impl std::ops::Add for Int {
|
|||
}
|
||||
}
|
||||
|
||||
impl const std::ops::Add for Int {
|
||||
impl const std::ops::Add for Int { //~ ERROR type annotations needed
|
||||
//~^ ERROR conflicting implementations of trait
|
||||
type Output = Self;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,21 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `i32`
|
||||
--> $DIR/const-and-non-const-impl.rs:5:1
|
||||
|
|
||||
LL | impl const std::ops::Add for i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl Add for i32;
|
||||
|
||||
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `Int`
|
||||
--> $DIR/const-and-non-const-impl.rs:23:1
|
||||
|
|
||||
LL | impl std::ops::Add for Int {
|
||||
| -------------------------- first implementation here
|
||||
...
|
||||
LL | impl const std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Int`
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/const-and-non-const-impl.rs:5:1
|
||||
|
|
||||
|
|
@ -28,7 +10,92 @@ LL | impl const std::ops::Add for i32 {
|
|||
|
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `Int`
|
||||
--> $DIR/const-and-non-const-impl.rs:22:1
|
||||
|
|
||||
LL | impl std::ops::Add for Int {
|
||||
| -------------------------- first implementation here
|
||||
...
|
||||
LL | impl const std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Int`
|
||||
|
||||
Some errors have detailed explanations: E0117, E0119.
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/const-and-non-const-impl.rs:5:12
|
||||
|
|
||||
LL | impl const std::ops::Add for i32 {
|
||||
| ^^^^^^^^^^^^^ cannot infer type for type `i32`
|
||||
|
|
||||
note: multiple `impl`s satisfying `i32: Add` found
|
||||
--> $DIR/const-and-non-const-impl.rs:5:1
|
||||
|
|
||||
LL | impl const std::ops::Add for i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: and another `impl` found in the `core` crate: `impl Add for i32;`
|
||||
note: required by a bound in `Add`
|
||||
--> $SRC_DIR/core/src/ops/arith.rs:LL:COL
|
||||
|
|
||||
LL | / pub trait Add<Rhs = Self> {
|
||||
LL | | /// The resulting type after applying the `+` operator.
|
||||
LL | | #[stable(feature = "rust1", since = "1.0.0")]
|
||||
LL | | type Output;
|
||||
... |
|
||||
LL | | fn add(self, rhs: Rhs) -> Self::Output;
|
||||
LL | | }
|
||||
| |_^ required by this bound in `Add`
|
||||
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/const-and-non-const-impl.rs:14:6
|
||||
|
|
||||
LL | impl std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^ cannot infer type for struct `Int`
|
||||
|
|
||||
note: multiple `impl`s satisfying `Int: Add` found
|
||||
--> $DIR/const-and-non-const-impl.rs:14:1
|
||||
|
|
||||
LL | impl std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | impl const std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: required by a bound in `Add`
|
||||
--> $SRC_DIR/core/src/ops/arith.rs:LL:COL
|
||||
|
|
||||
LL | / pub trait Add<Rhs = Self> {
|
||||
LL | | /// The resulting type after applying the `+` operator.
|
||||
LL | | #[stable(feature = "rust1", since = "1.0.0")]
|
||||
LL | | type Output;
|
||||
... |
|
||||
LL | | fn add(self, rhs: Rhs) -> Self::Output;
|
||||
LL | | }
|
||||
| |_^ required by this bound in `Add`
|
||||
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/const-and-non-const-impl.rs:22:12
|
||||
|
|
||||
LL | impl const std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^ cannot infer type for struct `Int`
|
||||
|
|
||||
note: multiple `impl`s satisfying `Int: Add` found
|
||||
--> $DIR/const-and-non-const-impl.rs:14:1
|
||||
|
|
||||
LL | impl std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | impl const std::ops::Add for Int {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: required by a bound in `Add`
|
||||
--> $SRC_DIR/core/src/ops/arith.rs:LL:COL
|
||||
|
|
||||
LL | / pub trait Add<Rhs = Self> {
|
||||
LL | | /// The resulting type after applying the `+` operator.
|
||||
LL | | #[stable(feature = "rust1", since = "1.0.0")]
|
||||
LL | | type Output;
|
||||
... |
|
||||
LL | | fn add(self, rhs: Rhs) -> Self::Output;
|
||||
LL | | }
|
||||
| |_^ required by this bound in `Add`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0117, E0119, E0283.
|
||||
For more information about an error, try `rustc --explain E0117`.
|
||||
|
|
|
|||
|
|
@ -1,11 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `impl OpaqueTrait`
|
||||
--> $DIR/issue-83613.rs:10:1
|
||||
|
|
||||
LL | impl<T: Send> AnotherTrait for T {}
|
||||
| -------------------------------- first implementation here
|
||||
LL | impl AnotherTrait for OpaqueType {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `impl OpaqueTrait`
|
||||
|
||||
error: cannot implement trait on type alias impl trait
|
||||
--> $DIR/issue-83613.rs:10:1
|
||||
|
|
||||
|
|
@ -18,6 +10,14 @@ note: type alias impl trait defined here
|
|||
LL | type OpaqueType = impl OpaqueTrait;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `impl OpaqueTrait`
|
||||
--> $DIR/issue-83613.rs:10:1
|
||||
|
|
||||
LL | impl<T: Send> AnotherTrait for T {}
|
||||
| -------------------------------- first implementation here
|
||||
LL | impl AnotherTrait for OpaqueType {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `impl OpaqueTrait`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0119`.
|
||||
|
|
|
|||
|
|
@ -50,12 +50,6 @@ LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
|||
|
|
||||
= help: add `#![feature(dispatch_from_dyn)]` to the crate attributes to enable
|
||||
|
||||
error[E0378]: the trait `DispatchFromDyn` may only be implemented for a coercion between structures
|
||||
--> $DIR/issue-78372.rs:3:1
|
||||
|
|
||||
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Smaht<[type error], [type error]>`)
|
||||
--> $DIR/issue-78372.rs:3:6
|
||||
|
|
||||
|
|
@ -65,6 +59,12 @@ LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
|||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
|
||||
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||
|
||||
error[E0378]: the trait `DispatchFromDyn` may only be implemented for a coercion between structures
|
||||
--> $DIR/issue-78372.rs:3:1
|
||||
|
|
||||
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0210, E0378, E0412, E0658.
|
||||
|
|
|
|||
|
|
@ -8,8 +8,7 @@ trait MyTrait {}
|
|||
impl MyTrait for () {}
|
||||
|
||||
impl<F> FnOnce<()> for &F {
|
||||
//~^ ERROR conflicting implementations
|
||||
//~| ERROR type parameter `F` must be used
|
||||
//~^ ERROR type parameter `F` must be used
|
||||
type Output = impl MyTrait;
|
||||
extern "rust-call" fn call_once(self, _: ()) -> Self::Output {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,3 @@
|
|||
error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`
|
||||
--> $DIR/incoherent-assoc-imp-trait.rs:10:1
|
||||
|
|
||||
LL | impl<F> FnOnce<()> for &F {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<A, F> FnOnce<A> for &F
|
||||
where F: Fn<A>, F: ?Sized;
|
||||
|
||||
error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct<F>`)
|
||||
--> $DIR/incoherent-assoc-imp-trait.rs:10:6
|
||||
|
|
||||
|
|
@ -17,7 +7,6 @@ LL | impl<F> FnOnce<()> for &F {
|
|||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
Some errors have detailed explanations: E0119, E0210.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
||||
For more information about this error, try `rustc --explain E0210`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue