Skip to content

Commit

Permalink
2229 migration: Don't try resolve regions before writeback
Browse files Browse the repository at this point in the history
In the analysis use `resolve_vars_if_possible` instead of `fully_resolve`,
because we might not have performed regionck yet.

Fixes: #83176
  • Loading branch information
arora-aman committed Mar 22, 2021
1 parent 97663b6 commit 74d7731
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 19 deletions.
19 changes: 2 additions & 17 deletions compiler/rustc_typeck/src/check/upvar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
//! then mean that all later passes would have to check for these figments
//! and report an error, and it just seems like more mess in the end.)

use super::writeback::Resolver;
use super::FnCtxt;

use crate::expr_use_visitor as euv;
Expand All @@ -42,7 +41,6 @@ use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc_infer::infer::UpvarRegion;
use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection, ProjectionKind};
use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::fold::TypeFoldable;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeckResults, UpvarSubsts};
use rustc_session::lint;
use rustc_span::sym;
Expand Down Expand Up @@ -167,7 +165,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

let closure_hir_id = self.tcx.hir().local_def_id_to_hir_id(local_def_id);
if should_do_migration_analysis(self.tcx, closure_hir_id) {
self.perform_2229_migration_anaysis(closure_def_id, capture_clause, span, body);
self.perform_2229_migration_anaysis(closure_def_id, capture_clause, span);
}

// We now fake capture information for all variables that are mentioned within the closure
Expand Down Expand Up @@ -467,13 +465,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
closure_def_id: DefId,
capture_clause: hir::CaptureBy,
span: Span,
body: &'tcx hir::Body<'tcx>,
) {
let need_migrations = self.compute_2229_migrations(
closure_def_id,
span,
capture_clause,
body,
self.typeck_results.borrow().closure_min_captures.get(&closure_def_id),
);

Expand Down Expand Up @@ -511,19 +507,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
closure_def_id: DefId,
closure_span: Span,
closure_clause: hir::CaptureBy,
body: &'tcx hir::Body<'tcx>,
min_captures: Option<&ty::RootVariableMinCaptureList<'tcx>>,
) -> Vec<hir::HirId> {
fn resolve_ty<T: TypeFoldable<'tcx>>(
fcx: &FnCtxt<'_, 'tcx>,
span: Span,
body: &'tcx hir::Body<'tcx>,
ty: T,
) -> T {
let mut resolver = Resolver::new(fcx, &span, body);
ty.fold_with(&mut resolver)
}

let upvars = if let Some(upvars) = self.tcx.upvars_mentioned(closure_def_id) {
upvars
} else {
Expand All @@ -533,7 +518,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut need_migrations = Vec::new();

for (&var_hir_id, _) in upvars.iter() {
let ty = resolve_ty(self, closure_span, body, self.node_ty(var_hir_id));
let ty = self.infcx.resolve_vars_if_possible(self.node_ty(var_hir_id));

if !ty.needs_drop(self.tcx, self.tcx.param_env(closure_def_id.expect_local())) {
continue;
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_typeck/src/check/writeback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ impl Locatable for hir::HirId {

/// The Resolver. This is the type folding engine that detects
/// unresolved types and so forth.
crate struct Resolver<'cx, 'tcx> {
struct Resolver<'cx, 'tcx> {
tcx: TyCtxt<'tcx>,
infcx: &'cx InferCtxt<'cx, 'tcx>,
span: &'cx dyn Locatable,
Expand All @@ -686,7 +686,7 @@ crate struct Resolver<'cx, 'tcx> {
}

impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
crate fn new(
fn new(
fcx: &'cx FnCtxt<'cx, 'tcx>,
span: &'cx dyn Locatable,
body: &'tcx hir::Body<'tcx>,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// run-pass

#![warn(disjoint_capture_drop_reorder)]

fn main() {
if let a = "" {
//~^ WARNING: irrefutable `if let` pattern
drop(|_: ()| drop(a));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
warning: irrefutable `if let` pattern
--> $DIR/issue-78720.rs:6:5
|
LL | / if let a = "" {
LL | |
LL | | drop(|_: ()| drop(a));
LL | | }
| |_____^
|
= note: `#[warn(irrefutable_let_patterns)]` on by default
= note: this pattern will always match, so the `if let` is useless
= help: consider replacing the `if let` with a `let`

warning: 1 warning emitted

0 comments on commit 74d7731

Please sign in to comment.