提交 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 trait Bar{}
pub trait Bar {}
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 @@
// is not met but the struct implements a trait with the same path.
fn main() {
let foo2 = {
let foo = {
extern crate crate_a2 as a;
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;
a::try_foo(foo2);
a::try_foo(foo);
//~^ ERROR E0277
//~| Trait impl with same name found
//~| trait impl with same name found
//~| 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
--> $DIR/trait-bounds-same-crate-name.rs:16:20
--> $DIR/trait-bounds-same-crate-name.rs:31:20
|
LL | a::try_foo(foo2);
| ^^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo`
LL | a::try_foo(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`
|
help: Trait impl with same name found
help: trait impl with same name found
--> $DIR/auxiliary/crate_a2.rs:5:1
|
LL | impl Bar for Foo {}
| ^^^^^^^^^^^^^^^^^^^
= 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`.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册