From 09f60272243ea1ed4389cb45145222641200add1 Mon Sep 17 00:00:00 2001 From: liudingming Date: Mon, 9 Aug 2021 20:25:57 +0800 Subject: [PATCH] Workaround of early exiting when `ExprUseVisitor` meets unresolved type var. Add regression test for issue-87814 Set needs_to_read to true when typeck errors. --- compiler/rustc_typeck/src/expr_use_visitor.rs | 10 ++++++++-- src/test/ui/closures/issue-87814-1.rs | 8 ++++++++ src/test/ui/closures/issue-87814-2.rs | 11 +++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/closures/issue-87814-1.rs create mode 100644 src/test/ui/closures/issue-87814-2.rs diff --git a/compiler/rustc_typeck/src/expr_use_visitor.rs b/compiler/rustc_typeck/src/expr_use_visitor.rs index b0c95939bb77d..8d401b7f44442 100644 --- a/compiler/rustc_typeck/src/expr_use_visitor.rs +++ b/compiler/rustc_typeck/src/expr_use_visitor.rs @@ -243,7 +243,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { let ExprUseVisitor { ref mc, body_owner: _, delegate: _ } = *self; let mut needs_to_be_read = false; for arm in arms.iter() { - return_if_err!(mc.cat_pattern(discr_place.clone(), &arm.pat, |place, pat| { + match mc.cat_pattern(discr_place.clone(), &arm.pat, |place, pat| { match &pat.kind { PatKind::Binding(.., opt_sub_pat) => { // If the opt_sub_pat is None, than the binding does not count as @@ -290,7 +290,13 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { // examined } } - })); + }) { + Ok(_) => (), + Err(_) => { + // If typeck failed, assume borrow is needed. + needs_to_be_read = true; + } + } } if needs_to_be_read { diff --git a/src/test/ui/closures/issue-87814-1.rs b/src/test/ui/closures/issue-87814-1.rs new file mode 100644 index 0000000000000..5cf01ddf5d71b --- /dev/null +++ b/src/test/ui/closures/issue-87814-1.rs @@ -0,0 +1,8 @@ +// check-pass +fn main() { + let mut schema_all = vec![]; + (0..42).for_each(|_x| match Err(()) as Result<(), _> { + Ok(()) => schema_all.push(()), + Err(_) => (), + }); +} diff --git a/src/test/ui/closures/issue-87814-2.rs b/src/test/ui/closures/issue-87814-2.rs new file mode 100644 index 0000000000000..7a5facdac58c3 --- /dev/null +++ b/src/test/ui/closures/issue-87814-2.rs @@ -0,0 +1,11 @@ +// check-pass +#![feature(try_reserve)] + +fn main() { + let mut schema_all: (Vec, Vec) = (vec![], vec![]); + + let _c = || match schema_all.0.try_reserve(1) as Result<(), _> { + Ok(()) => (), + Err(_) => (), + }; +}