Skip to content

Commit

Permalink
Unrolled build for rust-lang#134313
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#134313 - compiler-errors:no-itib-def-id, r=oli-obk

Don't make a def id for `impl_trait_in_bindings`

The def collector is awkward, so for now just wrap let statements in a new `ImplTraitContext::InBinding` which tells `visit_ty` not to make a def id for the type. This will not generalize to other ITIB cases, like if we allow them in turbofishes (e.g. `foo::<impl Fn()>(|| {})`).

Fixes rust-lang#134307

r? oli-obk
  • Loading branch information
rust-timer authored Dec 15, 2024
2 parents 87139bd + ca055ee commit 27821fa
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_resolve/src/def_collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
let kind = match self.impl_trait_context {
ImplTraitContext::Universal => DefKind::TyParam,
ImplTraitContext::Existential => DefKind::OpaqueTy,
ImplTraitContext::InBinding => return visit::walk_ty(self, ty),
};
let id = self.create_def(*id, name, kind, ty.span);
match self.impl_trait_context {
Expand All @@ -365,6 +366,7 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
ImplTraitContext::Existential => {
self.with_parent(id, |this| visit::walk_ty(this, ty))
}
ImplTraitContext::InBinding => unreachable!(),
};
}
_ => visit::walk_ty(self, ty),
Expand All @@ -374,6 +376,13 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
fn visit_stmt(&mut self, stmt: &'a Stmt) {
match stmt.kind {
StmtKind::MacCall(..) => self.visit_macro_invoc(stmt.id),
// FIXME(impl_trait_in_bindings): We don't really have a good way of
// introducing the right `ImplTraitContext` here for all the cases we
// care about, in case we want to introduce ITIB to other positions
// such as turbofishes (e.g. `foo::<impl Fn()>(|| {})`).
StmtKind::Let(ref local) => self.with_impl_trait(ImplTraitContext::InBinding, |this| {
visit::walk_local(this, local)
}),
_ => visit::walk_stmt(self, stmt),
}
}
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ impl InvocationParent {
enum ImplTraitContext {
Existential,
Universal,
InBinding,
}

/// Used for tracking import use types which will be used for redundant import checking.
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/impl-trait/in-bindings/dont-make-def-id.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//@ check-pass

// Make sure we don't create an opaque def id for ITIB.

#![crate_type = "lib"]
#![feature(impl_trait_in_bindings)]

fn foo() {
let _: impl Sized = 0;
}

0 comments on commit 27821fa

Please sign in to comment.