use crate::check::FnCtxt;
+use rustc_data_structures::stable_map::FxHashMap;
use rustc_errors::ErrorReported;
use rustc_hir as hir;
+use rustc_hir::def_id::DefId;
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
use rustc_infer::infer::InferCtxt;
+use rustc_middle::hir::place::Place as HirPlace;
+use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast};
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
use rustc_middle::ty::{self, Ty, TyCtxt};
}
wbcx.visit_body(body);
wbcx.visit_min_capture_map();
- wbcx.visit_upvar_capture_map();
+ wbcx.visit_fake_reads_map();
wbcx.visit_closures();
wbcx.visit_liberated_fn_sigs();
wbcx.visit_fru_field_types();
wbcx.typeck_results.treat_byte_string_as_slice =
mem::take(&mut self.typeck_results.borrow_mut().treat_byte_string_as_slice);
- wbcx.typeck_results.closure_captures =
- mem::take(&mut self.typeck_results.borrow_mut().closure_captures);
-
if self.is_tainted_by_errors() {
// FIXME(eddyb) keep track of `ErrorReported` from where the error was emitted.
wbcx.typeck_results.tainted_by_errors = Some(ErrorReported);
// operating on scalars, we clear the overload.
fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr<'_>) {
match e.kind {
- hir::ExprKind::Unary(hir::UnOp::UnNeg | hir::UnOp::UnNot, ref inner) => {
+ hir::ExprKind::Unary(hir::UnOp::Neg | hir::UnOp::Not, ref inner) => {
let inner_ty = self.fcx.node_ty(inner.hir_id);
let inner_ty = self.fcx.resolve_vars_if_possible(inner_ty);
let min_list_wb = min_list
.iter()
.map(|captured_place| {
- let locatable = captured_place.info.path_expr_id.unwrap_or(
- self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local()),
- );
+ let locatable = captured_place.info.path_expr_id.unwrap_or_else(|| {
+ self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local())
+ });
self.resolve(captured_place.clone(), &locatable)
})
self.typeck_results.closure_min_captures = min_captures_wb;
}
- fn visit_upvar_capture_map(&mut self) {
- for (upvar_id, upvar_capture) in self.fcx.typeck_results.borrow().upvar_capture_map.iter() {
- let new_upvar_capture = match *upvar_capture {
- ty::UpvarCapture::ByValue(span) => ty::UpvarCapture::ByValue(span),
- ty::UpvarCapture::ByRef(ref upvar_borrow) => {
- ty::UpvarCapture::ByRef(ty::UpvarBorrow {
- kind: upvar_borrow.kind,
- region: self.tcx().lifetimes.re_erased,
- })
- }
- };
- debug!("Upvar capture for {:?} resolved to {:?}", upvar_id, new_upvar_capture);
- self.typeck_results.upvar_capture_map.insert(*upvar_id, new_upvar_capture);
+ fn visit_fake_reads_map(&mut self) {
+ let mut resolved_closure_fake_reads: FxHashMap<
+ DefId,
+ Vec<(HirPlace<'tcx>, FakeReadCause, hir::HirId)>,
+ > = Default::default();
+ for (closure_def_id, fake_reads) in
+ self.fcx.typeck_results.borrow().closure_fake_reads.iter()
+ {
+ let mut resolved_fake_reads = Vec::<(HirPlace<'tcx>, FakeReadCause, hir::HirId)>::new();
+ for (place, cause, hir_id) in fake_reads.iter() {
+ let locatable =
+ self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local());
+
+ let resolved_fake_read = self.resolve(place.clone(), &locatable);
+ resolved_fake_reads.push((resolved_fake_read, *cause, *hir_id));
+ }
+ resolved_closure_fake_reads.insert(*closure_def_id, resolved_fake_reads);
}
+ self.typeck_results.closure_fake_reads = resolved_closure_fake_reads;
}
fn visit_closures(&mut self) {
let mut skip_add = false;
if let ty::Opaque(defin_ty_def_id, _substs) = *definition_ty.kind() {
- if let hir::OpaqueTyOrigin::Misc = opaque_defn.origin {
+ if let hir::OpaqueTyOrigin::Misc | hir::OpaqueTyOrigin::TyAlias = opaque_defn.origin
+ {
if def_id == defin_ty_def_id {
debug!(
"skipping adding concrete definition for opaque type {:?} {:?}",