Skip to content

Commit dcde587

Browse files
committed
Auto merge of rust-lang#132460 - lcnr:questionable-uwu, r=<try>
`TypingMode` sure seems like a good idea ## `infcx.typing_env` while defining opaque types I don't know how'll be able to correctly handle opaque types when using something taking a `TypingEnv` while defining opaque types. To correctly handle the opaques we need to be able to pass in the current `opaque_type_storage` and return constraints, i.e. we need to use a proper canonical query. We should migrate all the queries used during HIR typeck and borrowck where this matters to proper canonical queries. This is ## `layout_of` and `Reveal::All` We convert the `ParamEnv` to `Reveal::All` right at the start of the `layout_of` query, so I've changed callers of `layout_of` to already use a post analysis `TypingEnv` when encountering it. https://github.com/rust-lang/rust/blob/ca87b535a05097df6abbe2a031b057de2cefac5b/compiler/rustc_ty_utils/src/layout.rs#L51 r? `@ghost`
2 parents 209799f + 1d78b92 commit dcde587

File tree

243 files changed

+1841
-1408
lines changed

Some content is hidden

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

243 files changed

+1841
-1408
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -3833,11 +3833,16 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
38333833
if tcx.is_diagnostic_item(sym::deref_method, method_did) {
38343834
let deref_target =
38353835
tcx.get_diagnostic_item(sym::deref_target).and_then(|deref_target| {
3836-
Instance::try_resolve(tcx, self.param_env, deref_target, method_args)
3837-
.transpose()
3836+
Instance::try_resolve(
3837+
tcx,
3838+
self.infcx.typing_env(self.param_env),
3839+
deref_target,
3840+
method_args,
3841+
)
3842+
.transpose()
38383843
});
38393844
if let Some(Ok(instance)) = deref_target {
3840-
let deref_target_ty = instance.ty(tcx, self.param_env);
3845+
let deref_target_ty = instance.ty(tcx, self.infcx.typing_env(self.param_env));
38413846
err.note(format!("borrow occurs due to deref coercion to `{deref_target_ty}`"));
38423847
err.span_note(tcx.def_span(instance.def_id()), "deref defined here");
38433848
}

compiler/rustc_borrowck/src/diagnostics/mod.rs

+1-1
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

+1-1
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

+3-1
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

+1-1
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

+7-3
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

+9-9
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_target::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_target::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

+8-3
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

+5-3
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

+5-5
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
)

compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ mod simd;
2020
use cranelift_codegen::ir::AtomicRmwOp;
2121
use rustc_middle::ty;
2222
use rustc_middle::ty::GenericArgsRef;
23-
use rustc_middle::ty::layout::{HasParamEnv, ValidityRequirement};
23+
use rustc_middle::ty::layout::ValidityRequirement;
2424
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
2525
use rustc_span::source_map::Spanned;
2626
use rustc_span::symbol::{Symbol, sym};
@@ -687,7 +687,10 @@ fn codegen_regular_intrinsic_call<'tcx>(
687687
if let Some(requirement) = requirement {
688688
let do_panic = !fx
689689
.tcx
690-
.check_validity_requirement((requirement, fx.param_env().and(ty)))
690+
.check_validity_requirement((
691+
requirement,
692+
ty::TypingEnv::fully_monomorphized().as_query_input(ty),
693+
))
691694
.expect("expect to have layout during codegen");
692695

693696
if do_panic {
@@ -746,7 +749,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
746749

747750
let const_val = fx
748751
.tcx
749-
.const_eval_instance(ParamEnv::reveal_all(), instance, source_info.span)
752+
.const_eval_instance(ty::ParamEnv::reveal_all(), instance, source_info.span)
750753
.unwrap();
751754
let val = crate::constant::codegen_const_value(fx, const_val, ret.layout().ty);
752755
ret.write_cvalue(fx, val);

compiler/rustc_codegen_cranelift/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ mod prelude {
100100
pub(crate) use rustc_middle::mir::{self, *};
101101
pub(crate) use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
102102
pub(crate) use rustc_middle::ty::{
103-
self, FloatTy, Instance, InstanceKind, IntTy, ParamEnv, Ty, TyCtxt, UintTy,
103+
self, FloatTy, Instance, InstanceKind, IntTy, Ty, TyCtxt, UintTy,
104104
};
105105
pub(crate) use rustc_span::Span;
106106

compiler/rustc_codegen_cranelift/src/main_shim.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub(crate) fn maybe_create_entry_wrapper(
4949
// regions must appear in the argument
5050
// listing.
5151
let main_ret_ty = tcx.normalize_erasing_regions(
52-
ty::ParamEnv::reveal_all(),
52+
ty::TypingEnv::fully_monomorphized(),
5353
main_ret_ty.no_bound_vars().unwrap(),
5454
);
5555

@@ -113,7 +113,7 @@ pub(crate) fn maybe_create_entry_wrapper(
113113
.unwrap();
114114
let report = Instance::expect_resolve(
115115
tcx,
116-
ParamEnv::reveal_all(),
116+
ty::TypingEnv::fully_monomorphized(),
117117
report.def_id,
118118
tcx.mk_args(&[GenericArg::from(main_ret_ty)]),
119119
DUMMY_SP,
@@ -139,7 +139,7 @@ pub(crate) fn maybe_create_entry_wrapper(
139139
let start_def_id = tcx.require_lang_item(LangItem::Start, None);
140140
let start_instance = Instance::expect_resolve(
141141
tcx,
142-
ParamEnv::reveal_all(),
142+
ty::TypingEnv::fully_monomorphized(),
143143
start_def_id,
144144
tcx.mk_args(&[main_ret_ty.into()]),
145145
DUMMY_SP,

compiler/rustc_codegen_cranelift/src/unsize.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ pub(crate) fn unsized_info<'tcx>(
2222
target: Ty<'tcx>,
2323
old_info: Option<Value>,
2424
) -> Value {
25-
let (source, target) =
26-
fx.tcx.struct_lockstep_tails_for_codegen(source, target, ParamEnv::reveal_all());
25+
let (source, target) = fx.tcx.struct_lockstep_tails_for_codegen(
26+
source,
27+
target,
28+
ty::TypingEnv::fully_monomorphized(),
29+
);
2730
match (&source.kind(), &target.kind()) {
2831
(&ty::Array(_, len), &ty::Slice(_)) => fx.bcx.ins().iconst(
2932
fx.pointer_type,

compiler/rustc_codegen_cranelift/src/value_and_place.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ pub(crate) fn assert_assignable<'tcx>(
885885
}
886886
(ty::FnPtr(..), ty::FnPtr(..)) => {
887887
let from_sig = fx.tcx.normalize_erasing_late_bound_regions(
888-
ParamEnv::reveal_all(),
888+
ty::TypingEnv::fully_monomorphized(),
889889
from_ty.fn_sig(fx.tcx),
890890
);
891891
let FnSig {
@@ -894,9 +894,10 @@ pub(crate) fn assert_assignable<'tcx>(
894894
safety: unsafety_from,
895895
abi: abi_from,
896896
} = from_sig;
897-
let to_sig = fx
898-
.tcx
899-
.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), to_ty.fn_sig(fx.tcx));
897+
let to_sig = fx.tcx.normalize_erasing_late_bound_regions(
898+
ty::TypingEnv::fully_monomorphized(),
899+
to_ty.fn_sig(fx.tcx),
900+
);
900901
let FnSig {
901902
inputs_and_output: types_to,
902903
c_variadic: c_variadic_to,
@@ -932,9 +933,13 @@ pub(crate) fn assert_assignable<'tcx>(
932933
(&ty::Dynamic(from_traits, _, _from_kind), &ty::Dynamic(to_traits, _, _to_kind)) => {
933934
// FIXME(dyn-star): Do the right thing with DynKinds
934935
for (from, to) in from_traits.iter().zip(to_traits) {
935-
let from =
936-
fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), from);
937-
let to = fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), to);
936+
let from = fx.tcx.normalize_erasing_late_bound_regions(
937+
ty::TypingEnv::fully_monomorphized(),
938+
from,
939+
);
940+
let to = fx
941+
.tcx
942+
.normalize_erasing_late_bound_regions(ty::TypingEnv::fully_monomorphized(), to);
938943
assert_eq!(
939944
from, to,
940945
"Can't write trait object of incompatible traits {:?} to place with traits {:?}\n\n{:#?}",

compiler/rustc_codegen_gcc/src/builder.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ use rustc_data_structures::fx::FxHashSet;
2424
use rustc_middle::bug;
2525
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
2626
use rustc_middle::ty::layout::{
27-
FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, HasTyCtxt, LayoutError, LayoutOfHelpers,
27+
FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasTyCtxt, HasTypingEnv, LayoutError, LayoutOfHelpers,
2828
};
29-
use rustc_middle::ty::{Instance, ParamEnv, Ty, TyCtxt};
29+
use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
3030
use rustc_span::Span;
3131
use rustc_span::def_id::DefId;
3232
use rustc_target::abi::call::FnAbi;
@@ -2319,9 +2319,9 @@ impl<'a, 'gcc, 'tcx> StaticBuilderMethods for Builder<'a, 'gcc, 'tcx> {
23192319
}
23202320
}
23212321

2322-
impl<'tcx> HasParamEnv<'tcx> for Builder<'_, '_, 'tcx> {
2323-
fn param_env(&self) -> ParamEnv<'tcx> {
2324-
self.cx.param_env()
2322+
impl<'tcx> HasTypingEnv<'tcx> for Builder<'_, '_, 'tcx> {
2323+
fn typing_env(&self) -> ty::TypingEnv<'tcx> {
2324+
self.cx.typing_env()
23252325
}
23262326
}
23272327

compiler/rustc_codegen_gcc/src/consts.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
215215
let gcc_type = if nested {
216216
self.type_i8()
217217
} else {
218-
let ty = instance.ty(self.tcx, ty::ParamEnv::reveal_all());
218+
let ty = instance.ty(self.tcx, ty::TypingEnv::fully_monomorphized());
219219
self.layout_of(ty).gcc_type(self)
220220
};
221221

0 commit comments

Comments
 (0)