From b172932172978bf3f52e9e85e94661ff7bc442f3 Mon Sep 17 00:00:00 2001 From: Daria Sukhonina Date: Tue, 18 Nov 2025 18:06:09 +0300 Subject: [PATCH 1/2] Construct FnSig from a CycleError a bit differently for multiple threads Fixes #142053 --- compiler/rustc_middle/src/values.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_middle/src/values.rs b/compiler/rustc_middle/src/values.rs index 4d70a70873267..721b063071c61 100644 --- a/compiler/rustc_middle/src/values.rs +++ b/compiler/rustc_middle/src/values.rs @@ -3,6 +3,7 @@ use std::fmt::Write; use std::ops::ControlFlow; use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::sync; use rustc_errors::codes::*; use rustc_errors::{Applicability, MultiSpan, pluralize, struct_span_code_err}; use rustc_hir as hir; @@ -50,9 +51,14 @@ impl<'tcx> Value> for ty::Binder<'_, ty::FnSig<'_>> { ) -> Self { let err = Ty::new_error(tcx, guar); - let arity = if let Some(frame) = cycle_error.cycle.get(0) - && frame.query.dep_kind == dep_kinds::fn_sig - && let Some(def_id) = frame.query.def_id + let frame = if sync::is_dyn_thread_safe() { + cycle_error.usage.as_ref().map(|(_, query)| query) + } else { + cycle_error.cycle.first().map(|info| &info.query) + }; + let arity = if let Some(frame) = frame + && frame.dep_kind == dep_kinds::fn_sig + && let Some(def_id) = frame.def_id && let Some(node) = tcx.hir_get_if_local(def_id) && let Some(sig) = node.fn_sig() { From fd9387475b7a0c1c91b5f6ae46d336e399804e80 Mon Sep 17 00:00:00 2001 From: Daria Sukhonina Date: Tue, 18 Nov 2025 18:54:08 +0300 Subject: [PATCH 2/2] Fallback to use cycle_error.usage for FnSig creation --- compiler/rustc_middle/src/values.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_middle/src/values.rs b/compiler/rustc_middle/src/values.rs index 721b063071c61..3b6470d1c5891 100644 --- a/compiler/rustc_middle/src/values.rs +++ b/compiler/rustc_middle/src/values.rs @@ -51,11 +51,15 @@ impl<'tcx> Value> for ty::Binder<'_, ty::FnSig<'_>> { ) -> Self { let err = Ty::new_error(tcx, guar); - let frame = if sync::is_dyn_thread_safe() { + let frame = cycle_error.cycle.first().map(|info| &info.query).or_else(|| { + // FIXME: patchwork for #142064 + if !sync::is_dyn_thread_safe() { + tcx.dcx().abort_if_errors(); + unreachable!() + } cycle_error.usage.as_ref().map(|(_, query)| query) - } else { - cycle_error.cycle.first().map(|info| &info.query) - }; + }); + let arity = if let Some(frame) = frame && frame.dep_kind == dep_kinds::fn_sig && let Some(def_id) = frame.def_id