Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/unused_must_use.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/unused_must_use.rs110
1 files changed, 110 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unused_must_use.rs b/crates/ide-diagnostics/src/handlers/unused_must_use.rs
new file mode 100644
index 0000000000..4b9ecf2169
--- /dev/null
+++ b/crates/ide-diagnostics/src/handlers/unused_must_use.rs
@@ -0,0 +1,110 @@
+use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
+
+// Diagnostic: unused-must-use
+//
+// This diagnostic is triggered when a value with the `#[must_use]` attribute
+// is dropped without being used.
+pub(crate) fn unused_must_use(
+ ctx: &DiagnosticsContext<'_, '_>,
+ d: &hir::UnusedMustUse,
+) -> Diagnostic {
+ Diagnostic::new_with_syntax_node_ptr(
+ ctx,
+ DiagnosticCode::RustcLint("unused_must_use"),
+ "unused return value that must be used",
+ d.expr.map(Into::into),
+ )
+ .stable()
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::tests::check_diagnostics;
+
+ #[test]
+ fn unused_must_use_function_call() {
+ check_diagnostics(
+ r#"
+#[must_use]
+fn produces() -> i32 { 0 }
+fn main() {
+ produces();
+ //^^^^^^^^^^ warn: unused return value that must be used
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn unused_must_use_method_call() {
+ check_diagnostics(
+ r#"
+struct S;
+impl S {
+ #[must_use]
+ fn produces(&self) -> i32 { 0 }
+}
+fn main() {
+ let s = S;
+ s.produces();
+ //^^^^^^^^^^^^ warn: unused return value that must be used
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn unused_must_use_type() {
+ check_diagnostics(
+ r#"
+#[must_use]
+struct Important;
+fn produces() -> Important { Important }
+fn main() {
+ produces();
+ //^^^^^^^^^^ warn: unused return value that must be used
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn no_warning_when_value_used() {
+ check_diagnostics(
+ r#"
+#[must_use]
+fn produces() -> i32 { 0 }
+fn main() {
+ let _x = produces();
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn no_warning_when_no_must_use_attribute() {
+ check_diagnostics(
+ r#"
+fn ordinary() -> i32 { 0 }
+fn main() {
+ ordinary();
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn no_warning_when_value_assigned() {
+ check_diagnostics(
+ r#"
+#[must_use]
+fn produces() -> i32 { 0 }
+fn main() {
+ let x;
+ x = produces();
+ let _ = x;
+}
+"#,
+ );
+ }
+}