about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorAndy Russell <arussell123@gmail.com>2020-01-02 19:02:06 -0500
committerAndy Russell <arussell123@gmail.com>2020-01-03 17:57:23 -0500
commite589358210862cdbb34c124bcc95a67afe09135c (patch)
tree952b29c584b7b695baa24dbffc46b6259dbb15c4 /src/test
parent0a58f5864659ddfe1d95c122abaa75c88220aed0 (diff)
downloadrust-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.rs2
-rw-r--r--src/test/ui/issues/issue-17959.stderr16
-rw-r--r--src/test/ui/issues/issue-38868.stderr4
-rw-r--r--src/test/ui/reject-specialized-drops-8142.rs27
-rw-r--r--src/test/ui/reject-specialized-drops-8142.stderr96
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`.