Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. -- (not minimized yet) searched nightlies: from nightly-2024-01-11 to nightly-2024-01-13 regressed nightly: nightly-2024-01-12 searched commit range: regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.6.7</summaryHost triple: aarch64-apple-darwin Reproduce with: </details
label -E-needs-mcve +S-has-mcve +F-impltraitinassoctype +requires-nightly

Discussion:
return; } <del> if let Some(hir_sig) = self.tcx.hir_node_by_def_id(item_def_id).fn_decl() { if hir_sig.output.get_infer_ret_ty().is_some() { let guar = self.tcx.dcx().span_delayed_bug( hir_sig.output.span(), "inferring return types and opaque types do not mix well", ); self.found = Some(ty::OpaqueHiddenType { span: DUMMY_SP, ty: Ty::new_error(self.tcx, guar), }); return; } </del> <ins> // Function items with `_` in their return type already emit an error, skip any // "non-defining use" errors for them. // Note that we use `Node::fn_sig` instead of `Node::fn_decl` here, because the former // excludes closures, which are allowed to have `_` in their return type. let hir_node = self.tcx.hir_node_by_def_id(item_def_id); debug_assert!( !matches!(hir_node, Node::ForeignItem(..)), "foreign items cannot constrain opaque types", ); if let Some(hir_sig) = hir_node.fn_sig() && hir_sig.decl.output.get_infer_ret_ty().is_some() { let guar = self.tcx.dcx().span_delayed_bug( hir_sig.decl.output.span(), "inferring return types and opaque types do not mix well", ); self.found = Some(ty::OpaqueHiddenType { span: DUMMY_SP, ty: Ty::new_error(self.tcx, guar) }); return; </ins> } // Calling `mir_borrowck` can lead to cycle errors through

<ins> // check-pass // Regression test for an ICE: https://github.com/rust-lang/rust/issues/119916 #![feature(impl_trait_in_assoc_type)] #![feature(type_alias_impl_trait)] // `impl_trait_in_assoc_type` example from the bug report. pub trait StreamConsumer { type BarrierStream; fn execute() -> Self::BarrierStream; } pub struct DispatchExecutor; impl StreamConsumer for DispatchExecutor { type BarrierStream = impl Sized; fn execute() -> Self::BarrierStream { || -> _ {} } } // Functions that constrain TAITs can contain closures with an `_` in the return type. type Foo = impl Sized; fn foo() -> Foo { || -> _ {} } // The `_` in the closure return type can also be the TAIT itself. type Bar = impl Sized; fn bar() -> impl FnOnce() -> Bar { || -> _ {} } fn main() {} </ins>

fn main() { test(); } <ins> extern "Rust" { fn bar() -> Pointer<_>; //~^ ERROR: the placeholder `_` is not allowed within types } </ins>

|              |       not allowed in type signatures |              help: replace with the correct return type: `Pointer<i32>` <del> error: aborting due to 1 previous error </del> <ins> error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions --> $DIR/issue-77179.rs:17:25 | LL |     fn bar() -> Pointer<_>; |                         ^ |                         | |                         not allowed in type signatures |                         help: use type parameters instead: `T` error: aborting due to 2 previous errors </ins> For more information about this error, try `rustc --explain E0121`.