From ba3928db3a38bcd1bef4d520850ea6b4c7047219 Mon Sep 17 00:00:00 2001 From: Bhavesh Mandalapu Date: Wed, 12 Nov 2025 22:53:53 -0800 Subject: [PATCH 1/3] Reveal opaques defined in the body during analysis --- compiler/rustc_middle/src/mir/mod.rs | 18 +++++++++++++----- compiler/rustc_mir_transform/src/validate.rs | 3 +++ compiler/rustc_type_ir/src/infer_ctxt.rs | 11 +++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index a1f99de9165bc..ee21882e92652 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -418,11 +418,19 @@ impl<'tcx> Body<'tcx> { pub fn typing_env(&self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> { match self.phase { - // FIXME(#132279): we should reveal the opaques defined in the body during analysis. - MirPhase::Built | MirPhase::Analysis(_) => TypingEnv { - typing_mode: ty::TypingMode::non_body_analysis(), - param_env: tcx.param_env(self.source.def_id()), - }, + MirPhase::Built | MirPhase::Analysis(_) => { + let def_id = self.source.def_id(); + let typing_mode = match self.source.instance { + InstanceKind::Item(item_def_id) => item_def_id + .as_local() + .map_or(ty::TypingMode::non_body_analysis(), |local_def_id| { + ty::TypingMode::analysis_in_body(tcx, local_def_id) + }), + _ => ty::TypingMode::non_body_analysis(), + }; + + TypingEnv { typing_mode, param_env: tcx.param_env(def_id) } + } MirPhase::Runtime(_) => TypingEnv::post_analysis(tcx, self.source.def_id()), } } diff --git a/compiler/rustc_mir_transform/src/validate.rs b/compiler/rustc_mir_transform/src/validate.rs index 1f0490a120152..b960e14e448ba 100644 --- a/compiler/rustc_mir_transform/src/validate.rs +++ b/compiler/rustc_mir_transform/src/validate.rs @@ -619,6 +619,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { if pred.has_opaque_types() { return true; } + if self.typing_env.typing_mode.may_define_opaque_types() { + return true; + } let (infcx, param_env) = self.tcx.infer_ctxt().build_with_typing_env(self.typing_env); let ocx = ObligationCtxt::new(&infcx); diff --git a/compiler/rustc_type_ir/src/infer_ctxt.rs b/compiler/rustc_type_ir/src/infer_ctxt.rs index feafcee7bad9e..6771eb9678b71 100644 --- a/compiler/rustc_type_ir/src/infer_ctxt.rs +++ b/compiler/rustc_type_ir/src/infer_ctxt.rs @@ -133,6 +133,17 @@ impl TypingMode { TypingMode::PostBorrowckAnalysis { defined_opaque_types } } } + + /// Returns `true` if this typing mode is allowed to define new opaque types. + pub fn may_define_opaque_types(&self) -> bool { + match self { + TypingMode::Analysis { defining_opaque_types_and_generators } => { + !defining_opaque_types_and_generators.is_empty() + } + TypingMode::Borrowck { defining_opaque_types } => !defining_opaque_types.is_empty(), + _ => false, + } + } } #[cfg_attr(feature = "nightly", rustc_diagnostic_item = "type_ir_infer_ctxt_like")] From de7b3b24cf2ed183d8fd9a19729190f7055ef356 Mon Sep 17 00:00:00 2001 From: Bhavesh Mandalapu Date: Wed, 12 Nov 2025 22:58:30 -0800 Subject: [PATCH 2/3] Move passing crash test case --- .../type-alias-impl-trait/define-opaque-mir-validation.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{crashes/131886.rs => ui/type-alias-impl-trait/define-opaque-mir-validation.rs} (100%) diff --git a/tests/crashes/131886.rs b/tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs similarity index 100% rename from tests/crashes/131886.rs rename to tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs From df42e351044db82fbbe83e1a75e10061ba06371f Mon Sep 17 00:00:00 2001 From: Bhavesh Mandalapu Date: Thu, 13 Nov 2025 20:08:02 -0800 Subject: [PATCH 3/3] Remove known bug comment and check for test case pass --- tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs b/tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs index 16cb815f1c223..ce570dd079346 100644 --- a/tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs +++ b/tests/ui/type-alias-impl-trait/define-opaque-mir-validation.rs @@ -1,5 +1,5 @@ -//@ known-bug: #131886 //@ compile-flags: -Zvalidate-mir +//@ check-pass #![feature(type_alias_impl_trait)] type Tait = impl Sized;