summaryrefslogtreecommitdiff
path: root/tests/ui/lint/drop_ref.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/lint/drop_ref.rs')
-rw-r--r--tests/ui/lint/drop_ref.rs99
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/ui/lint/drop_ref.rs b/tests/ui/lint/drop_ref.rs
new file mode 100644
index 00000000000..db4f7569f6f
--- /dev/null
+++ b/tests/ui/lint/drop_ref.rs
@@ -0,0 +1,99 @@
+// check-pass
+
+#![warn(drop_ref)]
+
+struct SomeStruct;
+
+fn main() {
+ drop(&SomeStruct); //~ WARN calls to `std::mem::drop`
+
+ let mut owned1 = SomeStruct;
+ drop(&owned1); //~ WARN calls to `std::mem::drop`
+ drop(&&owned1); //~ WARN calls to `std::mem::drop`
+ drop(&mut owned1); //~ WARN calls to `std::mem::drop`
+ drop(owned1);
+
+ let reference1 = &SomeStruct;
+ drop(reference1); //~ WARN calls to `std::mem::drop`
+
+ let reference2 = &mut SomeStruct;
+ drop(reference2); //~ WARN calls to `std::mem::drop`
+
+ let ref reference3 = SomeStruct;
+ drop(reference3); //~ WARN calls to `std::mem::drop`
+}
+
+#[allow(dead_code)]
+fn test_generic_fn_drop<T>(val: T) {
+ drop(&val); //~ WARN calls to `std::mem::drop`
+ drop(val);
+}
+
+#[allow(dead_code)]
+fn test_similarly_named_function() {
+ fn drop<T>(_val: T) {}
+ drop(&SomeStruct); //OK; call to unrelated function which happens to have the same name
+ std::mem::drop(&SomeStruct); //~ WARN calls to `std::mem::drop`
+}
+
+#[derive(Copy, Clone)]
+pub struct Error;
+fn produce_half_owl_error() -> Result<(), Error> {
+ Ok(())
+}
+
+fn produce_half_owl_ok() -> Result<bool, ()> {
+ Ok(true)
+}
+
+#[allow(dead_code)]
+fn test_owl_result() -> Result<(), ()> {
+ produce_half_owl_error().map_err(|_| ())?;
+ produce_half_owl_ok().map(|_| ())?;
+ // the following should not be linted,
+ // we should not force users to use toilet closures
+ // to produce owl results when drop is more convenient
+ produce_half_owl_error().map_err(drop)?;
+ produce_half_owl_ok().map_err(drop)?;
+ Ok(())
+}
+
+#[allow(dead_code)]
+fn test_owl_result_2() -> Result<u8, ()> {
+ produce_half_owl_error().map_err(|_| ())?;
+ produce_half_owl_ok().map(|_| ())?;
+ // the following should not be linted,
+ // we should not force users to use toilet closures
+ // to produce owl results when drop is more convenient
+ produce_half_owl_error().map_err(drop)?;
+ produce_half_owl_ok().map(drop)?;
+ Ok(1)
+}
+
+#[allow(unused)]
+#[allow(clippy::unit_cmp)]
+fn issue10122(x: u8) {
+ // This is a function which returns a reference and has a side-effect, which means
+ // that calling drop() on the function is considered an idiomatic way of achieving
+ // the side-effect in a match arm.
+ fn println_and<T>(t: &T) -> &T {
+ println!("foo");
+ t
+ }
+
+ match x {
+ // Don't lint (copy type), we only care about side-effects
+ 0 => drop(println_and(&12)),
+ // Don't lint (no copy type), we only care about side-effects
+ 1 => drop(println_and(&String::new())),
+ 2 => {
+ // Lint, even if we only care about the side-effect, it's already in a block
+ drop(println_and(&13)); //~ WARN calls to `std::mem::drop`
+ },
+ // Lint, idiomatic use is only in body of `Arm`
+ 3 if drop(println_and(&14)) == () => (), //~ WARN calls to `std::mem::drop`
+ // Lint, not a fn/method call
+ 4 => drop(&2), //~ WARN calls to `std::mem::drop`
+ _ => (),
+ }
+}