summaryrefslogtreecommitdiffstats
path: root/src/test/ui/drop-bounds
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/drop-bounds')
-rw-r--r--src/test/ui/drop-bounds/drop-bounds-impl-drop.rs14
-rw-r--r--src/test/ui/drop-bounds/drop-bounds.rs19
-rw-r--r--src/test/ui/drop-bounds/drop-bounds.stderr50
3 files changed, 83 insertions, 0 deletions
diff --git a/src/test/ui/drop-bounds/drop-bounds-impl-drop.rs b/src/test/ui/drop-bounds/drop-bounds-impl-drop.rs
new file mode 100644
index 000000000..063efc7b3
--- /dev/null
+++ b/src/test/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/src/test/ui/drop-bounds/drop-bounds.rs b/src/test/ui/drop-bounds/drop-bounds.rs
new file mode 100644
index 000000000..c73538278
--- /dev/null
+++ b/src/test/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/src/test/ui/drop-bounds/drop-bounds.stderr b/src/test/ui/drop-bounds/drop-bounds.stderr
new file mode 100644
index 000000000..3ffb855a5
--- /dev/null
+++ b/src/test/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
+