Fix #56472.
let body = ir.tcx.hir().body(body_id);
for arg in &body.arguments {
+ let is_shorthand = match arg.pat.node {
+ crate::hir::PatKind::Struct(..) => true,
+ _ => false,
+ };
arg.pat.each_binding(|_bm, hir_id, _x, ident| {
debug!("adding argument {:?}", hir_id);
- fn_maps.add_variable(Arg(hir_id, ident.name));
+ let var = if is_shorthand {
+ Local(LocalInfo {
+ id: hir_id,
+ name: ident.name,
+ is_shorthand: true,
+ })
+ } else {
+ Arg(hir_id, ident.name)
+ };
+ fn_maps.add_variable(var);
})
};
--- /dev/null
+#![deny(unused_variables)]
+
+struct Point {
+ x: i32,
+ y: i32,
+}
+
+fn main() {
+ let points = vec!(Point { x: 1, y: 2 }, Point { x: 3, y: 4 });
+
+ let _: i32 = points.iter()
+ .map(|Point { x, y }| y)
+ //~^ ERROR unused variable
+ .sum();
+
+ let _: i32 = points.iter()
+ .map(|x| 4)
+ //~^ ERROR unused variable
+ .sum();
+}
--- /dev/null
+error: unused variable: `x`
+ --> $DIR/unused-closure-argument.rs:12:23
+ |
+LL | .map(|Point { x, y }| y)
+ | ^ help: try ignoring the field: `x: _`
+ |
+note: lint level defined here
+ --> $DIR/unused-closure-argument.rs:1:9
+ |
+LL | #![deny(unused_variables)]
+ | ^^^^^^^^^^^^^^^^
+
+error: unused variable: `x`
+ --> $DIR/unused-closure-argument.rs:17:15
+ |
+LL | .map(|x| 4)
+ | ^ help: consider prefixing with an underscore: `_x`
+
+error: aborting due to 2 previous errors
+