From 2969aece415baa1a42df2a06ba635311000a2b5b Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Sat, 14 Aug 2021 21:54:17 +0100 Subject: [PATCH 1/2] Fix dead code warning when inline const is used in pattern --- compiler/rustc_passes/src/dead.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs index 4e157b0a574fb..ae65222f3f22f 100644 --- a/compiler/rustc_passes/src/dead.rs +++ b/compiler/rustc_passes/src/dead.rs @@ -15,6 +15,7 @@ use rustc_middle::middle::privacy; use rustc_middle::ty::{self, DefIdTree, TyCtxt}; use rustc_session::lint; use rustc_span::symbol::{sym, Symbol}; +use std::mem; // Any local node that may call something in its body block should be // explored. For example, if it's a live Node::Item that is a @@ -395,8 +396,14 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> { } fn visit_anon_const(&mut self, c: &'tcx hir::AnonConst) { + // When inline const blocks are used in pattern position, paths + // referenced by it should be considered as used. + let in_pat = mem::replace(&mut self.in_pat, false); + self.live_symbols.insert(self.tcx.hir().local_def_id(c.hir_id)); intravisit::walk_anon_const(self, c); + + self.in_pat = in_pat; } } From e62ecdc5a7cbd44a9ade5061ddad4d8a4e1d6599 Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Sat, 14 Aug 2021 21:56:57 +0100 Subject: [PATCH 2/2] Add a dead code test for using anon const in pattern --- .../ui/lint/dead-code/anon-const-in-pat.rs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/ui/lint/dead-code/anon-const-in-pat.rs diff --git a/src/test/ui/lint/dead-code/anon-const-in-pat.rs b/src/test/ui/lint/dead-code/anon-const-in-pat.rs new file mode 100644 index 0000000000000..4c6211a279a58 --- /dev/null +++ b/src/test/ui/lint/dead-code/anon-const-in-pat.rs @@ -0,0 +1,45 @@ +// check-pass +#![feature(inline_const)] +#![allow(incomplete_features)] +#![deny(dead_code)] + +const fn one() -> i32 { + 1 +} + +const fn two() -> i32 { + 2 +} + +const fn three() -> i32 { + 3 +} + +fn inline_const() { + // rust-lang/rust#78171: dead_code lint triggers even though function is used in const pattern + match 1 { + const { one() } => {} + _ => {} + } +} + +fn inline_const_range() { + match 1 { + 1 ..= const { two() } => {} + _ => {} + } +} + +struct S; + +fn const_generic_arg() { + match S::<3> { + S::<{three()}> => {} + } +} + +fn main() { + inline_const(); + inline_const_range(); + const_generic_arg(); +}