diff options
Diffstat (limited to 'tests/ui/drop-bounds')
-rw-r--r-- | tests/ui/drop-bounds/drop-bounds-impl-drop.rs | 14 | ||||
-rw-r--r-- | tests/ui/drop-bounds/drop-bounds.rs | 19 | ||||
-rw-r--r-- | tests/ui/drop-bounds/drop-bounds.stderr | 50 |
3 files changed, 83 insertions, 0 deletions
diff --git a/tests/ui/drop-bounds/drop-bounds-impl-drop.rs b/tests/ui/drop-bounds/drop-bounds-impl-drop.rs new file mode 100644 index 000000000..063efc7b3 --- /dev/null +++ b/tests/ui/drop-bounds/drop-bounds-impl-drop.rs @@ -0,0 +1,14 @@ +// run-pass +#![deny(drop_bounds)] +// As a special exemption, `impl Drop` in the return position raises no error. +// This allows a convenient way to return an unnamed drop guard. +fn voldemort_type() -> impl Drop { + struct Voldemort; + impl Drop for Voldemort { + fn drop(&mut self) {} + } + Voldemort +} +fn main() { + let _ = voldemort_type(); +} diff --git a/tests/ui/drop-bounds/drop-bounds.rs b/tests/ui/drop-bounds/drop-bounds.rs new file mode 100644 index 000000000..c73538278 --- /dev/null +++ b/tests/ui/drop-bounds/drop-bounds.rs @@ -0,0 +1,19 @@ +#![deny(drop_bounds)] +fn foo<T: Drop>() {} //~ ERROR +fn bar<U>() +where + U: Drop, //~ ERROR +{ +} +fn baz(_x: impl Drop) {} //~ ERROR +struct Foo<T: Drop> { //~ ERROR + _x: T +} +struct Bar<U> where U: Drop { //~ ERROR + _x: U +} +trait Baz: Drop { //~ ERROR +} +impl<T: Drop> Baz for T { //~ ERROR +} +fn main() {} diff --git a/tests/ui/drop-bounds/drop-bounds.stderr b/tests/ui/drop-bounds/drop-bounds.stderr new file mode 100644 index 000000000..3ffb855a5 --- /dev/null +++ b/tests/ui/drop-bounds/drop-bounds.stderr @@ -0,0 +1,50 @@ +error: bounds on `T: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:2:11 + | +LL | fn foo<T: Drop>() {} + | ^^^^ + | +note: the lint level is defined here + --> $DIR/drop-bounds.rs:1:9 + | +LL | #![deny(drop_bounds)] + | ^^^^^^^^^^^ + +error: bounds on `U: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:5:8 + | +LL | U: Drop, + | ^^^^ + +error: bounds on `impl Drop: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:8:17 + | +LL | fn baz(_x: impl Drop) {} + | ^^^^ + +error: bounds on `T: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:9:15 + | +LL | struct Foo<T: Drop> { + | ^^^^ + +error: bounds on `U: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:12:24 + | +LL | struct Bar<U> where U: Drop { + | ^^^^ + +error: bounds on `Self: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:15:12 + | +LL | trait Baz: Drop { + | ^^^^ + +error: bounds on `T: Drop` are most likely incorrect, consider instead using `std::mem::needs_drop` to detect whether a type can be trivially dropped + --> $DIR/drop-bounds.rs:17:9 + | +LL | impl<T: Drop> Baz for T { + | ^^^^ + +error: aborting due to 7 previous errors + |