X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc%2Finfer%2Fanon_types%2Fmod.rs;h=96c64c05ccfbd9418868d5d1e8dbdf9d54a9976f;hb=6f637da50c56a22f745fd056691da8c86824cd9b;hp=ae4d88704a098e830c10bc3faafd19b5c1095f5d;hpb=bd455ef165f110143b97106b4e7cd8c83cd21f03;p=rust.git diff --git a/src/librustc/infer/anon_types/mod.rs b/src/librustc/infer/anon_types/mod.rs index ae4d88704a0..96c64c05ccf 100644 --- a/src/librustc/infer/anon_types/mod.rs +++ b/src/librustc/infer/anon_types/mod.rs @@ -592,7 +592,7 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> { fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { match ty.sty { - ty::TyClosure(def_id, substs) => { + ty::Closure(def_id, substs) => { // I am a horrible monster and I pray for death. When // we encounter a closure here, it is always a closure // from within the function that we are currently @@ -655,7 +655,7 @@ fn instantiate_anon_types_in_map>(&mut self, value: &T) -> tcx, reg_op: |reg| reg, fldop: |ty| { - if let ty::TyAnon(def_id, substs) = ty.sty { + if let ty::Anon(def_id, substs) = ty.sty { // Check that this is `impl Trait` type is // declared by `parent_def_id` -- i.e., one whose // value we are inferring. At present, this is @@ -679,7 +679,7 @@ fn instantiate_anon_types_in_map>(&mut self, value: &T) -> // ``` // // Here, the return type of `foo` references a - // `TyAnon` indeed, but not one whose value is + // `Anon` indeed, but not one whose value is // presently being inferred. You can get into a // similar situation with closure return types // today: @@ -691,25 +691,41 @@ fn instantiate_anon_types_in_map>(&mut self, value: &T) -> // } // ``` if let Some(anon_node_id) = tcx.hir.as_local_node_id(def_id) { - let in_definition_scope = match tcx.hir.expect_item(anon_node_id).node { - // impl trait - hir::ItemKind::Existential(hir::ExistTy { - impl_trait_fn: Some(parent), - .. - }) => parent == self.parent_def_id, - // named existential types - hir::ItemKind::Existential(hir::ExistTy { - impl_trait_fn: None, - .. - }) => may_define_existential_type( - tcx, - self.parent_def_id, - anon_node_id, - ), - _ => { - let anon_parent_node_id = tcx.hir.get_parent(anon_node_id); - self.parent_def_id == tcx.hir.local_def_id(anon_parent_node_id) + let parent_def_id = self.parent_def_id; + let def_scope_default = || { + let anon_parent_node_id = tcx.hir.get_parent(anon_node_id); + parent_def_id == tcx.hir.local_def_id(anon_parent_node_id) + }; + let in_definition_scope = match tcx.hir.find(anon_node_id) { + Some(hir::map::NodeItem(item)) => match item.node { + // impl trait + hir::ItemKind::Existential(hir::ExistTy { + impl_trait_fn: Some(parent), + .. + }) => parent == self.parent_def_id, + // named existential types + hir::ItemKind::Existential(hir::ExistTy { + impl_trait_fn: None, + .. + }) => may_define_existential_type( + tcx, + self.parent_def_id, + anon_node_id, + ), + _ => def_scope_default(), }, + Some(hir::map::NodeImplItem(item)) => match item.node { + hir::ImplItemKind::Existential(_) => may_define_existential_type( + tcx, + self.parent_def_id, + anon_node_id, + ), + _ => def_scope_default(), + }, + _ => bug!( + "expected (impl) item, found {}", + tcx.hir.node_to_string(anon_node_id), + ), }; if in_definition_scope { return self.fold_anon_ty(ty, def_id, substs); @@ -739,11 +755,11 @@ fn fold_anon_ty( let tcx = infcx.tcx; debug!( - "instantiate_anon_types: TyAnon(def_id={:?}, substs={:?})", + "instantiate_anon_types: Anon(def_id={:?}, substs={:?})", def_id, substs ); - // Use the same type variable if the exact same TyAnon appears more + // Use the same type variable if the exact same Anon appears more // than once in the return type (e.g. if it's passed to a type alias). if let Some(anon_defn) = self.anon_types.get(&def_id) { return anon_defn.concrete_ty; @@ -789,7 +805,7 @@ fn fold_anon_ty( for predicate in bounds.predicates { // Change the predicate to refer to the type variable, - // which will be the concrete type, instead of the TyAnon. + // which will be the concrete type, instead of the Anon. // This also instantiates nested `impl Trait`. let predicate = self.instantiate_anon_types_in_map(&predicate);