Rollup merge of #83124 - cjgillot:iiib, r=petrochenkov
Do not insert impl_trait_in_bindings opaque definitions twice. The reference to the item already appears inside the `OpaqueDef`. It does not need to be repeated as a statement.
This commit is contained in:
commit
9c7aca58fc
2 changed files with 17 additions and 66 deletions
|
@ -438,31 +438,6 @@ impl<'a> TokenStreamLowering<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ImplTraitTypeIdVisitor<'a> {
|
|
||||||
ids: &'a mut SmallVec<[NodeId; 1]>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Visitor<'_> for ImplTraitTypeIdVisitor<'_> {
|
|
||||||
fn visit_ty(&mut self, ty: &Ty) {
|
|
||||||
match ty.kind {
|
|
||||||
TyKind::Typeof(_) | TyKind::BareFn(_) => return,
|
|
||||||
|
|
||||||
TyKind::ImplTrait(id, _) => self.ids.push(id),
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
visit::walk_ty(self, ty);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_path_segment(&mut self, path_span: Span, path_segment: &PathSegment) {
|
|
||||||
if let Some(ref p) = path_segment.args {
|
|
||||||
if let GenericArgs::Parenthesized(_) = **p {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
visit::walk_path_segment(self, path_span, path_segment)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
fn lower_crate(mut self, c: &Crate) -> hir::Crate<'hir> {
|
fn lower_crate(mut self, c: &Crate) -> hir::Crate<'hir> {
|
||||||
/// Full-crate AST visitor that inserts into a fresh
|
/// Full-crate AST visitor that inserts into a fresh
|
||||||
|
@ -1789,14 +1764,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_local(&mut self, l: &Local) -> (hir::Local<'hir>, SmallVec<[NodeId; 1]>) {
|
fn lower_local(&mut self, l: &Local) -> hir::Local<'hir> {
|
||||||
let mut ids = SmallVec::<[NodeId; 1]>::new();
|
|
||||||
if self.sess.features_untracked().impl_trait_in_bindings {
|
|
||||||
if let Some(ref ty) = l.ty {
|
|
||||||
let mut visitor = ImplTraitTypeIdVisitor { ids: &mut ids };
|
|
||||||
visitor.visit_ty(ty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let ty = l.ty.as_ref().map(|t| {
|
let ty = l.ty.as_ref().map(|t| {
|
||||||
let mut capturable_lifetimes;
|
let mut capturable_lifetimes;
|
||||||
self.lower_ty(
|
self.lower_ty(
|
||||||
|
@ -1815,17 +1783,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
let init = l.init.as_ref().map(|e| self.lower_expr(e));
|
let init = l.init.as_ref().map(|e| self.lower_expr(e));
|
||||||
let hir_id = self.lower_node_id(l.id);
|
let hir_id = self.lower_node_id(l.id);
|
||||||
self.lower_attrs(hir_id, &l.attrs);
|
self.lower_attrs(hir_id, &l.attrs);
|
||||||
(
|
hir::Local {
|
||||||
hir::Local {
|
hir_id,
|
||||||
hir_id,
|
ty,
|
||||||
ty,
|
pat: self.lower_pat(&l.pat),
|
||||||
pat: self.lower_pat(&l.pat),
|
init,
|
||||||
init,
|
span: l.span,
|
||||||
span: l.span,
|
source: hir::LocalSource::Normal,
|
||||||
source: hir::LocalSource::Normal,
|
}
|
||||||
},
|
|
||||||
ids,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_fn_params_to_names(&mut self, decl: &FnDecl) -> &'hir [Ident] {
|
fn lower_fn_params_to_names(&mut self, decl: &FnDecl) -> &'hir [Ident] {
|
||||||
|
@ -2445,27 +2410,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt<'hir>; 1]> {
|
fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt<'hir>; 1]> {
|
||||||
let (hir_id, kind) = match s.kind {
|
let (hir_id, kind) = match s.kind {
|
||||||
StmtKind::Local(ref l) => {
|
StmtKind::Local(ref l) => {
|
||||||
let (l, item_ids) = self.lower_local(l);
|
let l = self.lower_local(l);
|
||||||
let mut ids: SmallVec<[hir::Stmt<'hir>; 1]> = item_ids
|
|
||||||
.into_iter()
|
|
||||||
.map(|item_id| {
|
|
||||||
let item_id = hir::ItemId {
|
|
||||||
// All the items that `lower_local` finds are `impl Trait` types.
|
|
||||||
def_id: self.lower_node_id(item_id).expect_owner(),
|
|
||||||
};
|
|
||||||
self.stmt(s.span, hir::StmtKind::Item(item_id))
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
let hir_id = self.lower_node_id(s.id);
|
let hir_id = self.lower_node_id(s.id);
|
||||||
self.alias_attrs(hir_id, l.hir_id);
|
self.alias_attrs(hir_id, l.hir_id);
|
||||||
ids.push({
|
return smallvec![hir::Stmt {
|
||||||
hir::Stmt {
|
hir_id,
|
||||||
hir_id,
|
kind: hir::StmtKind::Local(self.arena.alloc(l)),
|
||||||
kind: hir::StmtKind::Local(self.arena.alloc(l)),
|
span: s.span,
|
||||||
span: s.span,
|
}];
|
||||||
}
|
|
||||||
});
|
|
||||||
return ids;
|
|
||||||
}
|
}
|
||||||
StmtKind::Item(ref it) => {
|
StmtKind::Item(ref it) => {
|
||||||
// Can only use the ID once.
|
// Can only use the ID once.
|
||||||
|
|
|
@ -52,6 +52,7 @@ fn insert_vec_map<K: Idx, V: Clone>(map: &mut IndexVec<K, Option<V>>, k: K, v: V
|
||||||
if i >= len {
|
if i >= len {
|
||||||
map.extend(repeat(None).take(i - len + 1));
|
map.extend(repeat(None).take(i - len + 1));
|
||||||
}
|
}
|
||||||
|
debug_assert!(map[k].is_none());
|
||||||
map[k] = Some(v);
|
map[k] = Some(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,9 +217,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
|
||||||
// Overwrite the dummy hash with the real HIR owner hash.
|
// Overwrite the dummy hash with the real HIR owner hash.
|
||||||
nodes.hash = hash;
|
nodes.hash = hash;
|
||||||
|
|
||||||
// FIXME: feature(impl_trait_in_bindings) broken and trigger this assert
|
debug_assert!(data.signature.is_none());
|
||||||
//assert!(data.signature.is_none());
|
|
||||||
|
|
||||||
data.signature =
|
data.signature =
|
||||||
Some(self.arena.alloc(Owner { parent: entry.parent, node: entry.node }));
|
Some(self.arena.alloc(Owner { parent: entry.parent, node: entry.node }));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue