diff options
| author | Andy Russell <arussell123@gmail.com> | 2020-01-02 19:02:06 -0500 |
|---|---|---|
| committer | Andy Russell <arussell123@gmail.com> | 2020-01-03 17:57:23 -0500 |
| commit | e589358210862cdbb34c124bcc95a67afe09135c (patch) | |
| tree | 952b29c584b7b695baa24dbffc46b6259dbb15c4 /src/test | |
| parent | 0a58f5864659ddfe1d95c122abaa75c88220aed0 (diff) | |
| download | rust-e589358210862cdbb34c124bcc95a67afe09135c.tar.gz rust-e589358210862cdbb34c124bcc95a67afe09135c.zip | |
improve generic `Drop` error messages
- Use the span of the predicate - Use the def's description instead of "struct/enum" (notably incorrect for unions) - Align formatting with other error messages
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/issues/issue-17959.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-17959.stderr | 16 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-38868.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/reject-specialized-drops-8142.rs | 27 | ||||
| -rw-r--r-- | src/test/ui/reject-specialized-drops-8142.stderr | 96 |
5 files changed, 92 insertions, 53 deletions
diff --git a/src/test/ui/issues/issue-17959.rs b/src/test/ui/issues/issue-17959.rs index 73865ae2d2e..01416a0d79e 100644 --- a/src/test/ui/issues/issue-17959.rs +++ b/src/test/ui/issues/issue-17959.rs @@ -9,7 +9,7 @@ struct G<T: ?Sized> { } impl<T> Drop for G<T> { -//~^ ERROR: The requirement `T: std::marker::Sized` is added only by the Drop impl. [E0367] +//~^ ERROR `Drop` impl requires `T: std::marker::Sized` fn drop(&mut self) { if !self._ptr.is_null() { } diff --git a/src/test/ui/issues/issue-17959.stderr b/src/test/ui/issues/issue-17959.stderr index de742e48aea..29d32c1f3ce 100644 --- a/src/test/ui/issues/issue-17959.stderr +++ b/src/test/ui/issues/issue-17959.stderr @@ -1,16 +1,10 @@ -error[E0367]: The requirement `T: std::marker::Sized` is added only by the Drop impl. - --> $DIR/issue-17959.rs:11:1 +error[E0367]: `Drop` impl requires `T: std::marker::Sized` but the struct it is implemented for does not + --> $DIR/issue-17959.rs:11:6 | -LL | / impl<T> Drop for G<T> { -LL | | -LL | | fn drop(&mut self) { -LL | | if !self._ptr.is_null() { -LL | | } -LL | | } -LL | | } - | |_^ +LL | impl<T> Drop for G<T> { + | ^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/issue-17959.rs:7:1 | LL | / struct G<T: ?Sized> { diff --git a/src/test/ui/issues/issue-38868.stderr b/src/test/ui/issues/issue-38868.stderr index fe932c744bf..10d1e7c4e66 100644 --- a/src/test/ui/issues/issue-38868.stderr +++ b/src/test/ui/issues/issue-38868.stderr @@ -1,4 +1,4 @@ -error[E0366]: Implementations of Drop cannot be specialized +error[E0366]: `Drop` impls cannot be specialized --> $DIR/issue-38868.rs:5:1 | LL | / impl Drop for List<i32> { @@ -8,7 +8,7 @@ LL | | } LL | | } | |_^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/issue-38868.rs:1:1 | LL | / pub struct List<T> { diff --git a/src/test/ui/reject-specialized-drops-8142.rs b/src/test/ui/reject-specialized-drops-8142.rs index 655b42f5f8f..d7fec8802f0 100644 --- a/src/test/ui/reject-specialized-drops-8142.rs +++ b/src/test/ui/reject-specialized-drops-8142.rs @@ -1,5 +1,5 @@ // Issue 8142: Test that Drop impls cannot be specialized beyond the -// predicates attached to the struct/enum definition itself. +// predicates attached to the type definition itself. trait Bound { fn foo(&self) { } } struct K<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } @@ -16,12 +16,16 @@ struct U; struct V<Tva, Tvb> { x: *const Tva, y: *const Tvb } struct W<'l1, 'l2> { x: &'l1 i8, y: &'l2 u8 } +enum Enum<T> { Variant(T) } +struct TupleStruct<T>(T); +union Union<T: Copy> { f: T } + impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT - //~^ ERROR The requirement `'adds_bnd : 'al` is added only by the Drop impl. + //~^ ERROR `Drop` impl requires `'adds_bnd : 'al` fn drop(&mut self) { } } impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT - //~^ ERROR The requirement `'adds_bnd : 'al` is added only by the Drop impl. + //~^ ERROR `Drop` impl requires `'adds_bnd : 'al` fn drop(&mut self) { } } impl<'ml> Drop for M<'ml> { fn drop(&mut self) { } } // ACCEPT @@ -34,13 +38,13 @@ impl Drop for N<'static> { fn drop(&mut self) { } } // RE impl<COkNoBound> Drop for O<COkNoBound> { fn drop(&mut self) { } } // ACCEPT impl Drop for P<i8> { fn drop(&mut self) { } } // REJECT -//~^ ERROR Implementations of Drop cannot be specialized +//~^ ERROR `Drop` impls cannot be specialized impl<AddsBnd:Bound> Drop for Q<AddsBnd> { fn drop(&mut self) { } } // REJECT -//~^ ERROR The requirement `AddsBnd: Bound` is added only by the Drop impl. +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` impl<'rbnd,AddsRBnd:'rbnd> Drop for R<AddsRBnd> { fn drop(&mut self) { } } // REJECT -//~^ ERROR The requirement `AddsRBnd : 'rbnd` is added only by the Drop impl. +//~^ ERROR `Drop` impl requires `AddsRBnd : 'rbnd` impl<Bs:Bound> Drop for S<Bs> { fn drop(&mut self) { } } // ACCEPT @@ -49,9 +53,18 @@ impl<'t,Bt:'t> Drop for T<'t,Bt> { fn drop(&mut self) { } } // ACCEPT impl Drop for U { fn drop(&mut self) { } } // ACCEPT impl<One> Drop for V<One,One> { fn drop(&mut self) { } } // REJECT -//~^ ERROR Implementations of Drop cannot be specialized +//~^ ERROR `Drop` impls cannot be specialized impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT //~^ ERROR cannot infer an appropriate lifetime for lifetime parameter `'lw` +impl<AddsBnd:Bound> Drop for Enum<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + +impl<AddsBnd:Bound> Drop for TupleStruct<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + +impl<AddsBnd:Copy + Bound> Drop for Union<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + pub fn main() { } diff --git a/src/test/ui/reject-specialized-drops-8142.stderr b/src/test/ui/reject-specialized-drops-8142.stderr index 527babb0120..14618df90cb 100644 --- a/src/test/ui/reject-specialized-drops-8142.stderr +++ b/src/test/ui/reject-specialized-drops-8142.stderr @@ -1,33 +1,41 @@ -error[E0367]: The requirement `'adds_bnd : 'al` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:19:1 +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the union it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:67:21 + | +LL | impl<AddsBnd:Copy + Bound> Drop for Union<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:21:1 + | +LL | union Union<T: Copy> { f: T } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0367]: `Drop` impl requires `'adds_bnd : 'al` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:23:20 | -LL | / impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT -LL | | -LL | | fn drop(&mut self) { } } - | |____________________________^ +LL | impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT + | ^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:5:1 | LL | struct K<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `'adds_bnd : 'al` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:23:1 +error[E0367]: `Drop` impl requires `'adds_bnd : 'al` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:27:67 | -LL | / impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT -LL | | -LL | | fn drop(&mut self) { } } - | |____________________________^ +LL | impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT + | ^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:6:1 | LL | struct L<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/reject-specialized-drops-8142.rs:29:1 + --> $DIR/reject-specialized-drops-8142.rs:33:1 | LL | impl Drop for N<'static> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -41,56 +49,56 @@ LL | struct N<'n> { x: &'n i8 } | ^^ = note: ...does not necessarily outlive the static lifetime -error[E0366]: Implementations of Drop cannot be specialized - --> $DIR/reject-specialized-drops-8142.rs:36:1 +error[E0366]: `Drop` impls cannot be specialized + --> $DIR/reject-specialized-drops-8142.rs:40:1 | LL | impl Drop for P<i8> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/reject-specialized-drops-8142.rs:10:1 | LL | struct P<Tp> { x: *const Tp } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `AddsBnd: Bound` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:39:1 +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:43:14 | LL | impl<AddsBnd:Bound> Drop for Q<AddsBnd> { fn drop(&mut self) { } } // REJECT - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:11:1 | LL | struct Q<Tq> { x: *const Tq } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `AddsRBnd : 'rbnd` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:42:1 +error[E0367]: `Drop` impl requires `AddsRBnd : 'rbnd` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:46:21 | LL | impl<'rbnd,AddsRBnd:'rbnd> Drop for R<AddsRBnd> { fn drop(&mut self) { } } // REJECT - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:12:1 | LL | struct R<Tr> { x: *const Tr } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0366]: Implementations of Drop cannot be specialized - --> $DIR/reject-specialized-drops-8142.rs:51:1 +error[E0366]: `Drop` impls cannot be specialized + --> $DIR/reject-specialized-drops-8142.rs:55:1 | LL | impl<One> Drop for V<One,One> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/reject-specialized-drops-8142.rs:16:1 | LL | struct V<Tva, Tvb> { x: *const Tva, y: *const Tvb } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'lw` due to conflicting requirements - --> $DIR/reject-specialized-drops-8142.rs:54:1 + --> $DIR/reject-specialized-drops-8142.rs:58:1 | LL | impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -106,14 +114,38 @@ note: ...but the lifetime must also be valid for the lifetime `'l2` as defined o LL | struct W<'l1, 'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^ note: ...so that the types are compatible - --> $DIR/reject-specialized-drops-8142.rs:54:1 + --> $DIR/reject-specialized-drops-8142.rs:58:1 | LL | impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: expected `W<'l1, 'l2>` found `W<'_, '_>` -error: aborting due to 8 previous errors +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the enum it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:61:14 + | +LL | impl<AddsBnd:Bound> Drop for Enum<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:19:1 + | +LL | enum Enum<T> { Variant(T) } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:64:14 + | +LL | impl<AddsBnd:Bound> Drop for TupleStruct<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:20:1 + | +LL | struct TupleStruct<T>(T); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 11 previous errors Some errors have detailed explanations: E0308, E0366, E0367, E0495. For more information about an error, try `rustc --explain E0308`. |
