Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 9cba14b

Browse files
committed
use TypingEnv when no infcx is available
the behavior of the type system not only depends on the current assumptions, but also the currentnphase of the compiler. This is mostly necessary as we need to decide whether and how to reveal opaque types. We track this via the `TypingMode`.
1 parent bf6adec commit 9cba14b

File tree

240 files changed

+1739
-1340
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

240 files changed

+1739
-1340
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -682,8 +682,12 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
682682
// Normalize before comparing to see through type aliases and projections.
683683
let old_ty = ty::EarlyBinder::bind(ty).instantiate(tcx, generic_args);
684684
let new_ty = ty::EarlyBinder::bind(ty).instantiate(tcx, new_args);
685-
if let Ok(old_ty) = tcx.try_normalize_erasing_regions(self.param_env, old_ty)
686-
&& let Ok(new_ty) = tcx.try_normalize_erasing_regions(self.param_env, new_ty)
685+
if let Ok(old_ty) =
686+
tcx.try_normalize_erasing_regions(self.infcx.typing_env(self.param_env), old_ty)
687+
&& let Ok(new_ty) = tcx.try_normalize_erasing_regions(
688+
self.infcx.typing_env(self.param_env),
689+
new_ty,
690+
)
687691
{
688692
old_ty == new_ty
689693
} else {
@@ -3831,11 +3835,16 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
38313835
if tcx.is_diagnostic_item(sym::deref_method, method_did) {
38323836
let deref_target =
38333837
tcx.get_diagnostic_item(sym::deref_target).and_then(|deref_target| {
3834-
Instance::try_resolve(tcx, self.param_env, deref_target, method_args)
3835-
.transpose()
3838+
Instance::try_resolve(
3839+
tcx,
3840+
self.infcx.typing_env(self.param_env),
3841+
deref_target,
3842+
method_args,
3843+
)
3844+
.transpose()
38363845
});
38373846
if let Some(Ok(instance)) = deref_target {
3838-
let deref_target_ty = instance.ty(tcx, self.param_env);
3847+
let deref_target_ty = instance.ty(tcx, self.infcx.typing_env(self.param_env));
38393848
err.note(format!("borrow occurs due to deref coercion to `{deref_target_ty}`"));
38403849
err.span_note(tcx.def_span(instance.def_id()), "deref defined here");
38413850
}

compiler/rustc_borrowck/src/diagnostics/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
864864

865865
let kind = call_kind(
866866
self.infcx.tcx,
867-
self.param_env,
867+
self.infcx.typing_env(self.param_env),
868868
method_did,
869869
method_args,
870870
*fn_span,

compiler/rustc_borrowck/src/diagnostics/region_errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
952952

953953
if let Ok(Some(instance)) = ty::Instance::try_resolve(
954954
tcx,
955-
self.param_env,
955+
self.infcx.typing_env(self.param_env),
956956
*fn_did,
957957
self.infcx.resolve_vars_if_possible(args),
958958
) {

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
15271527
// The signature in this call can reference region variables,
15281528
// so erase them before calling a query.
15291529
let output_ty = self.tcx().erase_regions(sig.output());
1530-
if !output_ty.is_privately_uninhabited(self.tcx(), self.param_env) {
1530+
if !output_ty
1531+
.is_privately_uninhabited(self.tcx(), self.infcx.typing_env(self.param_env))
1532+
{
15311533
span_mirbug!(self, term, "call to converging function {:?} w/o dest", sig);
15321534
}
15331535
}

compiler/rustc_codegen_cranelift/src/abi/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ pub(crate) fn codegen_terminator_call<'tcx>(
376376
let instance = if let ty::FnDef(def_id, fn_args) = *func.layout().ty.kind() {
377377
let instance = ty::Instance::expect_resolve(
378378
fx.tcx,
379-
ty::ParamEnv::reveal_all(),
379+
ty::TypingEnv::fully_monomorphized(),
380380
def_id,
381381
fn_args,
382382
source_info.span,

compiler/rustc_codegen_cranelift/src/base.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ fn codegen_stmt<'tcx>(
666666
let func_ref = fx.get_function_ref(
667667
Instance::resolve_for_fn_ptr(
668668
fx.tcx,
669-
ParamEnv::reveal_all(),
669+
ty::TypingEnv::fully_monomorphized(),
670670
def_id,
671671
args,
672672
)
@@ -841,14 +841,18 @@ fn codegen_stmt<'tcx>(
841841
lval.write_cvalue(fx, CValue::by_val(operand, box_layout));
842842
}
843843
Rvalue::NullaryOp(ref null_op, ty) => {
844-
assert!(lval.layout().ty.is_sized(fx.tcx, ParamEnv::reveal_all()));
844+
assert!(lval.layout().ty.is_sized(fx.tcx, ty::ParamEnv::reveal_all()));
845845
let layout = fx.layout_of(fx.monomorphize(ty));
846846
let val = match null_op {
847847
NullOp::SizeOf => layout.size.bytes(),
848848
NullOp::AlignOf => layout.align.abi.bytes(),
849849
NullOp::OffsetOf(fields) => fx
850850
.tcx
851-
.offset_of_subfield(ParamEnv::reveal_all(), layout, fields.iter())
851+
.offset_of_subfield(
852+
ty::TypingEnv::fully_monomorphized(),
853+
layout,
854+
fields.iter(),
855+
)
852856
.bytes(),
853857
NullOp::UbChecks => {
854858
let val = fx.tcx.sess.ub_checks();

compiler/rustc_codegen_cranelift/src/common.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ fn clif_pair_type_from_ty<'tcx>(
103103

104104
/// Is a pointer to this type a wide ptr?
105105
pub(crate) fn has_ptr_meta<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool {
106-
if ty.is_sized(tcx, ParamEnv::reveal_all()) {
106+
if ty.is_sized(tcx, ty::ParamEnv::reveal_all()) {
107107
return false;
108108
}
109109

110-
let tail = tcx.struct_tail_for_codegen(ty, ParamEnv::reveal_all());
110+
let tail = tcx.struct_tail_for_codegen(ty, ty::TypingEnv::fully_monomorphized());
111111
match tail.kind() {
112112
ty::Foreign(..) => false,
113113
ty::Str | ty::Slice(..) | ty::Dynamic(..) => true,
@@ -339,9 +339,9 @@ impl<'tcx> rustc_abi::HasDataLayout for FunctionCx<'_, '_, 'tcx> {
339339
}
340340
}
341341

342-
impl<'tcx> layout::HasParamEnv<'tcx> for FunctionCx<'_, '_, 'tcx> {
343-
fn param_env(&self) -> ParamEnv<'tcx> {
344-
ParamEnv::reveal_all()
342+
impl<'tcx> layout::HasTypingEnv<'tcx> for FunctionCx<'_, '_, 'tcx> {
343+
fn typing_env(&self) -> ty::TypingEnv<'tcx> {
344+
ty::TypingEnv::fully_monomorphized()
345345
}
346346
}
347347

@@ -358,7 +358,7 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
358358
{
359359
self.instance.instantiate_mir_and_normalize_erasing_regions(
360360
self.tcx,
361-
ty::ParamEnv::reveal_all(),
361+
ty::TypingEnv::fully_monomorphized(),
362362
ty::EarlyBinder::bind(value),
363363
)
364364
}
@@ -497,9 +497,9 @@ impl<'tcx> rustc_abi::HasDataLayout for RevealAllLayoutCx<'tcx> {
497497
}
498498
}
499499

500-
impl<'tcx> layout::HasParamEnv<'tcx> for RevealAllLayoutCx<'tcx> {
501-
fn param_env(&self) -> ParamEnv<'tcx> {
502-
ParamEnv::reveal_all()
500+
impl<'tcx> layout::HasTypingEnv<'tcx> for RevealAllLayoutCx<'tcx> {
501+
fn typing_env(&self) -> ty::TypingEnv<'tcx> {
502+
ty::TypingEnv::fully_monomorphized()
503503
}
504504
}
505505

compiler/rustc_codegen_cranelift/src/constant.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub(crate) fn eval_mir_constant<'tcx>(
7878
let cv = fx.monomorphize(constant.const_);
7979
// This cannot fail because we checked all required_consts in advance.
8080
let val = cv
81-
.eval(fx.tcx, ty::ParamEnv::reveal_all(), constant.span)
81+
.eval(fx.tcx, ty::TypingEnv::fully_monomorphized(), constant.span)
8282
.expect("erroneous constant missed by mono item collection");
8383
(val, cv.ty())
8484
}
@@ -265,8 +265,13 @@ fn data_id_for_static(
265265
assert!(!definition);
266266
assert!(!tcx.is_mutable_static(def_id));
267267

268-
let ty = instance.ty(tcx, ParamEnv::reveal_all());
269-
let align = tcx.layout_of(ParamEnv::reveal_all().and(ty)).unwrap().align.pref.bytes();
268+
let ty = instance.ty(tcx, ty::TypingEnv::fully_monomorphized());
269+
let align = tcx
270+
.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty))
271+
.unwrap()
272+
.align
273+
.pref
274+
.bytes();
270275

271276
let linkage = if import_linkage == rustc_middle::mir::mono::Linkage::ExternalWeak
272277
|| import_linkage == rustc_middle::mir::mono::Linkage::WeakAny

compiler/rustc_codegen_cranelift/src/debuginfo/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl DebugContext {
210210

211211
type_names::push_generic_params(
212212
tcx,
213-
tcx.normalize_erasing_regions(ty::ParamEnv::reveal_all(), args),
213+
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), args),
214214
&mut name,
215215
);
216216

@@ -275,8 +275,10 @@ impl DebugContext {
275275
let span = tcx.def_span(def_id);
276276
let (file_id, line, _column) = self.get_span_loc(tcx, span, span);
277277

278-
let static_type = Instance::mono(tcx, def_id).ty(tcx, ty::ParamEnv::reveal_all());
279-
let static_layout = tcx.layout_of(ty::ParamEnv::reveal_all().and(static_type)).unwrap();
278+
let static_type = Instance::mono(tcx, def_id).ty(tcx, ty::TypingEnv::fully_monomorphized());
279+
let static_layout = tcx
280+
.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(static_type))
281+
.unwrap();
280282
// FIXME use the actual type layout
281283
let type_id = self.debug_type(tcx, type_dbg, static_type);
282284

compiler/rustc_codegen_cranelift/src/inline_asm.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
9292
if let ty::FnDef(def_id, args) = *const_.ty().kind() {
9393
let instance = ty::Instance::resolve_for_fn_ptr(
9494
fx.tcx,
95-
ty::ParamEnv::reveal_all(),
95+
ty::TypingEnv::fully_monomorphized(),
9696
def_id,
9797
args,
9898
)
@@ -227,11 +227,11 @@ pub(crate) fn codegen_naked_asm<'tcx>(
227227
InlineAsmOperand::Const { ref value } => {
228228
let cv = instance.instantiate_mir_and_normalize_erasing_regions(
229229
tcx,
230-
ty::ParamEnv::reveal_all(),
230+
ty::TypingEnv::fully_monomorphized(),
231231
ty::EarlyBinder::bind(value.const_),
232232
);
233233
let const_value = cv
234-
.eval(tcx, ty::ParamEnv::reveal_all(), value.span)
234+
.eval(tcx, ty::TypingEnv::fully_monomorphized(), value.span)
235235
.expect("erroneous constant missed by mono item collection");
236236

237237
let value = rustc_codegen_ssa::common::asm_const_to_str(
@@ -250,13 +250,13 @@ pub(crate) fn codegen_naked_asm<'tcx>(
250250

251251
let const_ = instance.instantiate_mir_and_normalize_erasing_regions(
252252
tcx,
253-
ty::ParamEnv::reveal_all(),
253+
ty::TypingEnv::fully_monomorphized(),
254254
ty::EarlyBinder::bind(value.const_),
255255
);
256256
if let ty::FnDef(def_id, args) = *const_.ty().kind() {
257257
let instance = ty::Instance::resolve_for_fn_ptr(
258258
tcx,
259-
ty::ParamEnv::reveal_all(),
259+
ty::TypingEnv::fully_monomorphized(),
260260
def_id,
261261
args,
262262
)

0 commit comments

Comments
 (0)