提交 318fb9a4 编写于 作者: T Timo Freiberg

fixup! Add negative tests where the diagnostic message would be wrong

上级 dffdf378
pub struct Foo; pub trait Bar {}
pub trait Bar{} pub fn try_foo(x: impl Bar) {}
pub fn try_foo(x: impl Bar){} pub struct ImplementsTraitForUsize<T> {
_marker: std::marker::PhantomData<T>,
}
impl Bar for ImplementsTraitForUsize<usize> {}
pub struct Foo; pub struct Foo;
pub trait Bar{} pub trait Bar {}
impl Bar for Foo {} impl Bar for Foo {}
pub struct DoesNotImplementTrait;
pub struct ImplementsWrongTraitConditionally<T> {
_marker: std::marker::PhantomData<T>,
}
impl Bar for ImplementsWrongTraitConditionally<isize> {}
...@@ -6,16 +6,50 @@ ...@@ -6,16 +6,50 @@
// is not met but the struct implements a trait with the same path. // is not met but the struct implements a trait with the same path.
fn main() { fn main() {
let foo2 = { let foo = {
extern crate crate_a2 as a; extern crate crate_a2 as a;
a::Foo a::Foo
}; };
let implements_no_traits = {
extern crate crate_a2 as a;
a::DoesNotImplementTrait
};
let other_variant_implements_mismatched_trait = {
extern crate crate_a2 as a;
a::ImplementsWrongTraitConditionally { _marker: std::marker::PhantomData::<isize> }
};
let other_variant_implements_correct_trait = {
extern crate crate_a1 as a;
a::ImplementsTraitForUsize { _marker: std::marker::PhantomData::<isize> }
};
{ {
extern crate crate_a1 as a; extern crate crate_a1 as a;
a::try_foo(foo2); a::try_foo(foo);
//~^ ERROR E0277 //~^ ERROR E0277
//~| Trait impl with same name found //~| trait impl with same name found
//~| Perhaps two different versions of crate `crate_a2` //~| Perhaps two different versions of crate `crate_a2`
// We don't want to see the "version mismatch" help message here
// because `implements_no_traits` has no impl for `Foo`
a::try_foo(implements_no_traits);
//~^ ERROR E0277
// We don't want to see the "version mismatch" help message here
// because `other_variant_implements_mismatched_trait`
// does not have an impl for its `<isize>` variant,
// only for its `<usize>` variant.
a::try_foo(other_variant_implements_mismatched_trait);
//~^ ERROR E0277
// We don't want to see the "version mismatch" help message here
// because `ImplementsTraitForUsize` only has
// impls for the correct trait where the path is not misleading.
a::try_foo(other_variant_implements_correct_trait);
//~^ ERROR E0277
//~| the following implementations were found:
} }
} }
error[E0277]: the trait bound `main::a::Foo: main::a::Bar` is not satisfied error[E0277]: the trait bound `main::a::Foo: main::a::Bar` is not satisfied
--> $DIR/trait-bounds-same-crate-name.rs:16:20 --> $DIR/trait-bounds-same-crate-name.rs:31:20
| |
LL | a::try_foo(foo2); LL | a::try_foo(foo);
| ^^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo` | ^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo`
| |
::: $DIR/auxiliary/crate_a1.rs:5:24 ::: $DIR/auxiliary/crate_a1.rs:3:24
| |
LL | pub fn try_foo(x: impl Bar){} LL | pub fn try_foo(x: impl Bar) {}
| --- required by this bound in `main::a::try_foo` | --- required by this bound in `main::a::try_foo`
| |
help: Trait impl with same name found help: trait impl with same name found
--> $DIR/auxiliary/crate_a2.rs:5:1 --> $DIR/auxiliary/crate_a2.rs:5:1
| |
LL | impl Bar for Foo {} LL | impl Bar for Foo {}
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
= note: Perhaps two different versions of crate `crate_a2` are being used? = note: Perhaps two different versions of crate `crate_a2` are being used?
error: aborting due to previous error error[E0277]: the trait bound `main::a::DoesNotImplementTrait: main::a::Bar` is not satisfied
--> $DIR/trait-bounds-same-crate-name.rs:38:20
|
LL | a::try_foo(implements_no_traits);
| ^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::DoesNotImplementTrait`
|
::: $DIR/auxiliary/crate_a1.rs:3:24
|
LL | pub fn try_foo(x: impl Bar) {}
| --- required by this bound in `main::a::try_foo`
error[E0277]: the trait bound `main::a::ImplementsWrongTraitConditionally<isize>: main::a::Bar` is not satisfied
--> $DIR/trait-bounds-same-crate-name.rs:45:20
|
LL | a::try_foo(other_variant_implements_mismatched_trait);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::ImplementsWrongTraitConditionally<isize>`
|
::: $DIR/auxiliary/crate_a1.rs:3:24
|
LL | pub fn try_foo(x: impl Bar) {}
| --- required by this bound in `main::a::try_foo`
|
help: trait impl with same name found
--> $DIR/auxiliary/crate_a2.rs:13:1
|
LL | impl Bar for ImplementsWrongTraitConditionally<isize> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: Perhaps two different versions of crate `crate_a2` are being used?
error[E0277]: the trait bound `main::a::ImplementsTraitForUsize<isize>: main::a::Bar` is not satisfied
--> $DIR/trait-bounds-same-crate-name.rs:51:20
|
LL | a::try_foo(other_variant_implements_correct_trait);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::ImplementsTraitForUsize<isize>`
|
::: $DIR/auxiliary/crate_a1.rs:3:24
|
LL | pub fn try_foo(x: impl Bar) {}
| --- required by this bound in `main::a::try_foo`
|
= help: the following implementations were found:
<main::a::ImplementsTraitForUsize<usize> as main::a::Bar>
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0277`. For more information about this error, try `rustc --explain E0277`.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册