rust/tests/ui/lint/unit_bindings.rs
2024-10-21 21:33:33 +08:00

61 lines
2.0 KiB
Rust

//! Basic checks for `unit_bindings` lint.
//!
//! The `unit_bindings` lint tries to detect cases like `let list = list.sort()`. The lint will
//! trigger on bindings that have the unit `()` type **except** if:
//!
//! - The user wrote `()` on either side, i.e.
//! - `let () = <expr>;` or `let <expr> = ();`
//! - `let _ = ();`
//! - The binding occurs within macro expansions, e.g. `foo!();`.
//! - The user explicitly provided type annotations, e.g. `let x: () = <expr>`.
//!
//! Examples where the lint *should* fire on include:
//!
//! - `let _ = <expr>;`
//! - `let pat = <expr>;`
//! - `let _pat = <expr>;`
//@ revisions: default_level deny_level
//@[default_level] check-pass (`unit_bindings` is currently allow-by-default)
#![allow(unused)]
#![cfg_attr(deny_level, deny(unit_bindings))]
// The `list` binding below should trigger the lint if it's not contained in a macro expansion.
macro_rules! expands_to_sus {
() => {
let mut v = [1, 2, 3];
let list = v.sort();
}
}
// No warning for `y` and `z` because it is provided as type parameter.
fn ty_param_check<T: Copy>(x: T) {
let y = x;
let z: T = x;
}
fn main() {
// No warning if user explicitly wrote `()` on either side.
let expr = ();
let () = expr;
let _ = ();
// No warning if user explicitly annotates the unit type on the binding.
let pat: () = expr;
// No warning for let bindings with unit type in macro expansions.
expands_to_sus!();
// No warning for unit bindings in generic fns.
ty_param_check(());
let _ = expr; //[deny_level]~ ERROR binding has unit type
let pat = expr; //[deny_level]~ ERROR binding has unit type
let _pat = expr; //[deny_level]~ ERROR binding has unit type
let mut v = [1, 2, 3];
let list = v.sort(); //[deny_level]~ ERROR binding has unit type
// Limitation: the lint currently does not fire on nested unit LHS bindings, i.e.
// this will not currently trigger the lint.
let (nested, _) = (expr, 0i32);
}