Auto merge of #108112 - nnethercote:clarify-iterator-interners, r=oli-obk,compiler-errors
Clarify iterator interners I found the iterator interners very confusing. This PR clarifies things. r? `@compiler-errors`
This commit is contained in:
commit
a9842c73bc
@ -2589,7 +2589,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||
DefKind::InlineConst => substs.as_inline_const().parent_substs(),
|
||||
other => bug!("unexpected item {:?}", other),
|
||||
};
|
||||
let parent_substs = tcx.mk_substs(parent_substs.iter());
|
||||
let parent_substs = tcx.intern_substs(parent_substs);
|
||||
|
||||
assert_eq!(typeck_root_substs.len(), parent_substs.len());
|
||||
if let Err(_) = self.eq_substs(
|
||||
|
@ -56,7 +56,7 @@ pub(crate) fn maybe_codegen<'tcx>(
|
||||
Some(fx.easy_call("__multi3", &[lhs, rhs], val_ty))
|
||||
}
|
||||
} else {
|
||||
let out_ty = fx.tcx.mk_tup([lhs.layout().ty, fx.tcx.types.bool].iter());
|
||||
let out_ty = fx.tcx.intern_tup(&[lhs.layout().ty, fx.tcx.types.bool]);
|
||||
let oflow = CPlace::new_stack_slot(fx, fx.layout_of(fx.tcx.types.i32));
|
||||
let lhs = lhs.load_scalar(fx);
|
||||
let rhs = rhs.load_scalar(fx);
|
||||
@ -78,7 +78,7 @@ pub(crate) fn maybe_codegen<'tcx>(
|
||||
}
|
||||
BinOp::Add | BinOp::Sub | BinOp::Mul => {
|
||||
assert!(checked);
|
||||
let out_ty = fx.tcx.mk_tup([lhs.layout().ty, fx.tcx.types.bool].iter());
|
||||
let out_ty = fx.tcx.intern_tup(&[lhs.layout().ty, fx.tcx.types.bool]);
|
||||
let out_place = CPlace::new_stack_slot(fx, fx.layout_of(out_ty));
|
||||
let (param_types, args) = if fx.tcx.sess.target.is_like_windows {
|
||||
let (lhs_ptr, lhs_extra) = lhs.force_stack(fx);
|
||||
|
@ -191,7 +191,7 @@ fn llvm_add_sub<'tcx>(
|
||||
// carry0 | carry1 -> carry or borrow respectively
|
||||
let cb_out = fx.bcx.ins().bor(cb0, cb1);
|
||||
|
||||
let layout = fx.layout_of(fx.tcx.mk_tup([fx.tcx.types.u8, fx.tcx.types.u64].iter()));
|
||||
let layout = fx.layout_of(fx.tcx.intern_tup(&[fx.tcx.types.u8, fx.tcx.types.u64]));
|
||||
let val = CValue::by_val_pair(cb_out, c, layout);
|
||||
ret.write_cvalue(fx, val);
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ pub(crate) fn maybe_create_entry_wrapper(
|
||||
tcx,
|
||||
ParamEnv::reveal_all(),
|
||||
report.def_id,
|
||||
tcx.mk_substs([GenericArg::from(main_ret_ty)].iter()),
|
||||
tcx.intern_substs(&[GenericArg::from(main_ret_ty)]),
|
||||
)
|
||||
.unwrap()
|
||||
.unwrap()
|
||||
|
@ -289,7 +289,7 @@ pub(crate) fn codegen_checked_int_binop<'tcx>(
|
||||
_ => bug!("binop {:?} on checked int/uint lhs: {:?} rhs: {:?}", bin_op, in_lhs, in_rhs),
|
||||
};
|
||||
|
||||
let out_layout = fx.layout_of(fx.tcx.mk_tup([in_lhs.layout().ty, fx.tcx.types.bool].iter()));
|
||||
let out_layout = fx.layout_of(fx.tcx.intern_tup(&[in_lhs.layout().ty, fx.tcx.types.bool]));
|
||||
CValue::by_val_pair(res, has_overflow, out_layout)
|
||||
}
|
||||
|
||||
|
@ -27,8 +27,6 @@ use rustc_middle::ty::Instance;
|
||||
use std::cell::RefCell;
|
||||
use std::ffi::CString;
|
||||
|
||||
use std::iter;
|
||||
|
||||
pub mod mapgen;
|
||||
|
||||
const UNUSED_FUNCTION_COUNTER_ID: CounterValueReference = CounterValueReference::START;
|
||||
@ -201,7 +199,7 @@ fn declare_unused_fn<'tcx>(cx: &CodegenCx<'_, 'tcx>, def_id: DefId) -> Instance<
|
||||
tcx.symbol_name(instance).name,
|
||||
cx.fn_abi_of_fn_ptr(
|
||||
ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
iter::once(tcx.mk_unit()),
|
||||
[tcx.mk_unit()],
|
||||
tcx.mk_unit(),
|
||||
false,
|
||||
hir::Unsafety::Unsafe,
|
||||
|
@ -22,7 +22,6 @@ use rustc_target::abi::{self, Align, HasDataLayout, Primitive};
|
||||
use rustc_target::spec::{HasTargetSpec, PanicStrategy};
|
||||
|
||||
use std::cmp::Ordering;
|
||||
use std::iter;
|
||||
|
||||
fn get_simple_intrinsic<'ll>(
|
||||
cx: &CodegenCx<'ll, '_>,
|
||||
@ -798,7 +797,7 @@ fn get_rust_try_fn<'ll, 'tcx>(
|
||||
let i8p = tcx.mk_mut_ptr(tcx.types.i8);
|
||||
// `unsafe fn(*mut i8) -> ()`
|
||||
let try_fn_ty = tcx.mk_fn_ptr(ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
iter::once(i8p),
|
||||
[i8p],
|
||||
tcx.mk_unit(),
|
||||
false,
|
||||
hir::Unsafety::Unsafe,
|
||||
@ -806,7 +805,7 @@ fn get_rust_try_fn<'ll, 'tcx>(
|
||||
)));
|
||||
// `unsafe fn(*mut i8, *mut i8) -> ()`
|
||||
let catch_fn_ty = tcx.mk_fn_ptr(ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
[i8p, i8p].iter().cloned(),
|
||||
[i8p, i8p],
|
||||
tcx.mk_unit(),
|
||||
false,
|
||||
hir::Unsafety::Unsafe,
|
||||
@ -814,7 +813,7 @@ fn get_rust_try_fn<'ll, 'tcx>(
|
||||
)));
|
||||
// `unsafe fn(unsafe fn(*mut i8) -> (), *mut i8, unsafe fn(*mut i8, *mut i8) -> ()) -> i32`
|
||||
let rust_fn_sig = ty::Binder::dummy(cx.tcx.mk_fn_sig(
|
||||
[try_fn_ty, i8p, catch_fn_ty].into_iter(),
|
||||
[try_fn_ty, i8p, catch_fn_ty],
|
||||
tcx.types.i32,
|
||||
false,
|
||||
hir::Unsafety::Unsafe,
|
||||
|
@ -96,7 +96,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
let loc_ty = self
|
||||
.tcx
|
||||
.type_of(self.tcx.require_lang_item(LangItem::PanicLocation, None))
|
||||
.subst(*self.tcx, self.tcx.mk_substs([self.tcx.lifetimes.re_erased.into()].iter()));
|
||||
.subst(*self.tcx, self.tcx.intern_substs(&[self.tcx.lifetimes.re_erased.into()]));
|
||||
let loc_layout = self.layout_of(loc_ty).unwrap();
|
||||
let location = self.allocate(loc_layout, MemoryKind::CallerLocation).unwrap();
|
||||
|
||||
|
@ -1608,7 +1608,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
.collect::<SmallVec<[_; 8]>>();
|
||||
v.sort_by(|a, b| a.skip_binder().stable_cmp(tcx, &b.skip_binder()));
|
||||
v.dedup();
|
||||
let existential_predicates = tcx.mk_poly_existential_predicates(v.into_iter());
|
||||
let existential_predicates = tcx.intern_poly_existential_predicates(&v);
|
||||
|
||||
// Use explicitly-specified region bound.
|
||||
let region_bound = if !lifetime.is_elided() {
|
||||
@ -3109,7 +3109,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
|
||||
debug!(?output_ty);
|
||||
|
||||
let fn_ty = tcx.mk_fn_sig(input_tys.into_iter(), output_ty, decl.c_variadic, unsafety, abi);
|
||||
let fn_ty = tcx.mk_fn_sig(input_tys, output_ty, decl.c_variadic, unsafety, abi);
|
||||
let bare_fn_ty = ty::Binder::bind_with_vars(fn_ty, bound_vars);
|
||||
|
||||
if !self.allow_ty_infer() && !(visitor.0.is_empty() && infer_replacements.is_empty()) {
|
||||
|
@ -1936,7 +1936,7 @@ pub(super) fn check_type_bounds<'tcx>(
|
||||
.into()
|
||||
}
|
||||
});
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(bound_vars.into_iter());
|
||||
let bound_vars = tcx.intern_bound_variable_kinds(&bound_vars);
|
||||
let impl_ty_substs = tcx.intern_substs(&substs);
|
||||
let container_id = impl_ty.container_id(tcx);
|
||||
|
||||
|
@ -15,8 +15,6 @@ use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
use std::iter;
|
||||
|
||||
fn equate_intrinsic_type<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
it: &hir::ForeignItem<'_>,
|
||||
@ -139,14 +137,10 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
|
||||
let intrinsic_name = tcx.item_name(intrinsic_id);
|
||||
let name_str = intrinsic_name.as_str();
|
||||
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(
|
||||
[
|
||||
ty::BoundVariableKind::Region(ty::BrAnon(0, None)),
|
||||
ty::BoundVariableKind::Region(ty::BrEnv),
|
||||
]
|
||||
.iter()
|
||||
.copied(),
|
||||
);
|
||||
let bound_vars = tcx.intern_bound_variable_kinds(&[
|
||||
ty::BoundVariableKind::Region(ty::BrAnon(0, None)),
|
||||
ty::BoundVariableKind::Region(ty::BrEnv),
|
||||
]);
|
||||
let mk_va_list_ty = |mutbl| {
|
||||
tcx.lang_items().va_list().map(|did| {
|
||||
let region = tcx.mk_re_late_bound(
|
||||
@ -378,21 +372,21 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
|
||||
(
|
||||
1,
|
||||
vec![tcx.mk_imm_ref(tcx.mk_re_late_bound(ty::INNERMOST, br), param(0))],
|
||||
tcx.mk_projection(discriminant_def_id, tcx.mk_substs([param(0).into()].iter())),
|
||||
tcx.mk_projection(discriminant_def_id, tcx.intern_substs(&[param(0).into()])),
|
||||
)
|
||||
}
|
||||
|
||||
kw::Try => {
|
||||
let mut_u8 = tcx.mk_mut_ptr(tcx.types.u8);
|
||||
let try_fn_ty = ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
iter::once(mut_u8),
|
||||
[mut_u8],
|
||||
tcx.mk_unit(),
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
Abi::Rust,
|
||||
));
|
||||
let catch_fn_ty = ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
[mut_u8, mut_u8].iter().cloned(),
|
||||
[mut_u8, mut_u8],
|
||||
tcx.mk_unit(),
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
@ -447,7 +441,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
|
||||
};
|
||||
(n_tps, 0, inputs, output, unsafety)
|
||||
};
|
||||
let sig = tcx.mk_fn_sig(inputs.into_iter(), output, false, unsafety, Abi::RustIntrinsic);
|
||||
let sig = tcx.mk_fn_sig(inputs, output, false, unsafety, Abi::RustIntrinsic);
|
||||
let sig = ty::Binder::bind_with_vars(sig, bound_vars);
|
||||
equate_intrinsic_type(tcx, it, n_tps, n_lts, sig)
|
||||
}
|
||||
@ -545,13 +539,7 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
|
||||
}
|
||||
};
|
||||
|
||||
let sig = tcx.mk_fn_sig(
|
||||
inputs.into_iter(),
|
||||
output,
|
||||
false,
|
||||
hir::Unsafety::Unsafe,
|
||||
Abi::PlatformIntrinsic,
|
||||
);
|
||||
let sig = tcx.mk_fn_sig(inputs, output, false, hir::Unsafety::Unsafe, Abi::PlatformIntrinsic);
|
||||
let sig = ty::Binder::dummy(sig);
|
||||
equate_intrinsic_type(tcx, it, n_tps, 0, sig)
|
||||
}
|
||||
|
@ -113,7 +113,6 @@ use rustc_target::spec::abi::Abi;
|
||||
use rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt as _;
|
||||
use rustc_trait_selection::traits::{self, ObligationCause, ObligationCauseCode};
|
||||
|
||||
use std::iter;
|
||||
use std::ops::Not;
|
||||
|
||||
use astconv::AstConv;
|
||||
@ -348,7 +347,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
|
||||
}
|
||||
|
||||
let se_ty = tcx.mk_fn_ptr(expected_return_type.map_bound(|expected_return_type| {
|
||||
tcx.mk_fn_sig(iter::empty(), expected_return_type, false, hir::Unsafety::Normal, Abi::Rust)
|
||||
tcx.mk_fn_sig([], expected_return_type, false, hir::Unsafety::Normal, Abi::Rust)
|
||||
}));
|
||||
|
||||
require_same_types(
|
||||
@ -434,7 +433,7 @@ fn check_start_fn_ty(tcx: TyCtxt<'_>, start_def_id: DefId) {
|
||||
}
|
||||
|
||||
let se_ty = tcx.mk_fn_ptr(ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
[tcx.types.isize, tcx.mk_imm_ptr(tcx.mk_imm_ptr(tcx.types.u8))].iter().cloned(),
|
||||
[tcx.types.isize, tcx.mk_imm_ptr(tcx.mk_imm_ptr(tcx.types.u8))],
|
||||
tcx.types.isize,
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
|
@ -264,7 +264,7 @@ fn check_lang_start_fn<'tcx>(
|
||||
let fn_generic = generics.param_at(0, tcx);
|
||||
let generic_ty = tcx.mk_ty_param(fn_generic.index, fn_generic.name);
|
||||
let expected_fn_sig =
|
||||
tcx.mk_fn_sig([].iter(), &generic_ty, false, hir::Unsafety::Normal, Abi::Rust);
|
||||
tcx.mk_fn_sig([], generic_ty, false, hir::Unsafety::Normal, Abi::Rust);
|
||||
let expected_ty = tcx.mk_fn_ptr(Binder::dummy(expected_fn_sig));
|
||||
|
||||
// we emit the same error to suggest changing the arg no matter what's wrong with the arg
|
||||
|
@ -126,7 +126,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// the `closures` table.
|
||||
let sig = bound_sig.map_bound(|sig| {
|
||||
self.tcx.mk_fn_sig(
|
||||
iter::once(self.tcx.intern_tup(sig.inputs())),
|
||||
[self.tcx.intern_tup(sig.inputs())],
|
||||
sig.output(),
|
||||
sig.c_variadic,
|
||||
sig.unsafety,
|
||||
@ -326,7 +326,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
debug!(?ret_param_ty);
|
||||
|
||||
let sig = projection.rebind(self.tcx.mk_fn_sig(
|
||||
input_tys.iter(),
|
||||
input_tys,
|
||||
ret_param_ty,
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
|
@ -312,7 +312,7 @@ pub fn resolve_interior<'a, 'tcx>(
|
||||
|
||||
// Extract type components to build the witness type.
|
||||
let type_list = fcx.tcx.mk_type_list(type_causes.iter().map(|cause| cause.ty));
|
||||
let bound_vars = fcx.tcx.mk_bound_variable_kinds(bound_vars.iter());
|
||||
let bound_vars = fcx.tcx.intern_bound_variable_kinds(&bound_vars);
|
||||
let witness =
|
||||
fcx.tcx.mk_generator_witness(ty::Binder::bind_with_vars(type_list, bound_vars.clone()));
|
||||
|
||||
|
@ -301,7 +301,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
// Build a tuple (U0..Un) of the final upvar types U0..Un
|
||||
// and unify the upvar tuple type in the closure with it:
|
||||
let final_tupled_upvars_type = self.tcx.mk_tup(final_upvar_tys.iter());
|
||||
let final_tupled_upvars_type = self.tcx.intern_tup(&final_upvar_tys);
|
||||
self.demand_suptype(span, substs.tupled_upvars_ty(), final_tupled_upvars_type);
|
||||
|
||||
let fake_reads = delegate
|
||||
@ -315,8 +315,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
self.typeck_results.borrow_mut().closure_size_eval.insert(
|
||||
closure_def_id,
|
||||
ClosureSizeProfileData {
|
||||
before_feature_tys: self.tcx.mk_tup(before_feature_tys.into_iter()),
|
||||
after_feature_tys: self.tcx.mk_tup(after_feature_tys.into_iter()),
|
||||
before_feature_tys: self.tcx.intern_tup(&before_feature_tys),
|
||||
after_feature_tys: self.tcx.intern_tup(&after_feature_tys),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -502,7 +502,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
.subst_identity()
|
||||
.fn_sig(self.tcx)
|
||||
.inputs()
|
||||
.map_bound(|slice| self.tcx.mk_type_list(slice.iter())),
|
||||
.map_bound(|slice| self.tcx.intern_type_list(slice)),
|
||||
);
|
||||
|
||||
argument_types
|
||||
|
@ -2525,14 +2525,12 @@ impl<'tcx> ConstantKind<'tcx> {
|
||||
}
|
||||
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def.did);
|
||||
let parent_substs = if let Some(parent_hir_id) = tcx.hir().opt_parent_id(hir_id) {
|
||||
if let Some(parent_did) = parent_hir_id.as_owner() {
|
||||
InternalSubsts::identity_for_item(tcx, parent_did.to_def_id())
|
||||
} else {
|
||||
tcx.mk_substs(Vec::<GenericArg<'tcx>>::new().into_iter())
|
||||
}
|
||||
let parent_substs = if let Some(parent_hir_id) = tcx.hir().opt_parent_id(hir_id)
|
||||
&& let Some(parent_did) = parent_hir_id.as_owner()
|
||||
{
|
||||
InternalSubsts::identity_for_item(tcx, parent_did.to_def_id())
|
||||
} else {
|
||||
tcx.mk_substs(Vec::<GenericArg<'tcx>>::new().into_iter())
|
||||
tcx.intern_substs(&[])
|
||||
};
|
||||
debug!(?parent_substs);
|
||||
|
||||
|
@ -67,7 +67,7 @@ use rustc_target::abi::{Layout, LayoutS, TargetDataLayout, VariantIdx};
|
||||
use rustc_target::spec::abi;
|
||||
use rustc_type_ir::sty::TyKind::*;
|
||||
use rustc_type_ir::WithCachedTypeInfo;
|
||||
use rustc_type_ir::{DynKind, InternAs, InternIteratorElement, Interner, TypeFlags};
|
||||
use rustc_type_ir::{CollectAndApply, DynKind, Interner, TypeFlags};
|
||||
|
||||
use std::any::Any;
|
||||
use std::borrow::Borrow;
|
||||
@ -1190,7 +1190,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
self.mk_imm_ref(
|
||||
self.lifetimes.re_static,
|
||||
self.type_of(self.require_lang_item(LangItem::PanicLocation, None))
|
||||
.subst(self, self.mk_substs([self.lifetimes.re_static.into()].iter())),
|
||||
.subst(self, self.intern_substs(&[self.lifetimes.re_static.into()])),
|
||||
)
|
||||
}
|
||||
|
||||
@ -1660,11 +1660,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
unsafety: hir::Unsafety,
|
||||
) -> PolyFnSig<'tcx> {
|
||||
sig.map_bound(|s| {
|
||||
let params_iter = match s.inputs()[0].kind() {
|
||||
ty::Tuple(params) => params.into_iter(),
|
||||
let params = match s.inputs()[0].kind() {
|
||||
ty::Tuple(params) => *params,
|
||||
_ => bug!(),
|
||||
};
|
||||
self.mk_fn_sig(params_iter, s.output(), s.c_variadic, unsafety, abi::Abi::Rust)
|
||||
self.mk_fn_sig(params, s.output(), s.c_variadic, unsafety, abi::Abi::Rust)
|
||||
})
|
||||
}
|
||||
|
||||
@ -1835,8 +1835,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
if ts.is_empty() { self.types.unit } else { self.mk_ty(Tuple(self.intern_type_list(&ts))) }
|
||||
}
|
||||
|
||||
pub fn mk_tup<I: InternAs<Ty<'tcx>, Ty<'tcx>>>(self, iter: I) -> I::Output {
|
||||
iter.intern_with(|ts| self.intern_tup(ts))
|
||||
pub fn mk_tup<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<Ty<'tcx>, Ty<'tcx>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |ts| self.intern_tup(ts))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@ -2157,11 +2161,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn mk_const_list<I: InternAs<ty::Const<'tcx>, &'tcx List<ty::Const<'tcx>>>>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_const_list(xs))
|
||||
pub fn mk_const_list<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<ty::Const<'tcx>, &'tcx List<ty::Const<'tcx>>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_const_list(xs))
|
||||
}
|
||||
|
||||
pub fn intern_const_list(self, cs: &[ty::Const<'tcx>]) -> &'tcx List<ty::Const<'tcx>> {
|
||||
@ -2210,18 +2215,24 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
if ts.is_empty() { List::empty() } else { self._intern_bound_variable_kinds(ts) }
|
||||
}
|
||||
|
||||
pub fn mk_fn_sig<I>(
|
||||
// Unlike various other `mk_*` functions, this one uses `I: IntoIterator`
|
||||
// instead of `I: Iterator`. Unlike those other functions, this one doesn't
|
||||
// have a `intern_fn_sig` variant that can be used for cases where `I` is
|
||||
// something like a `Vec`. That's because of the need to combine `inputs`
|
||||
// and `output`.
|
||||
pub fn mk_fn_sig<I, T>(
|
||||
self,
|
||||
inputs: I,
|
||||
output: I::Item,
|
||||
c_variadic: bool,
|
||||
unsafety: hir::Unsafety,
|
||||
abi: abi::Abi,
|
||||
) -> <I::Item as InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>::Output
|
||||
) -> T::Output
|
||||
where
|
||||
I: Iterator<Item: InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>,
|
||||
I: IntoIterator<Item = T>,
|
||||
T: CollectAndApply<Ty<'tcx>, ty::FnSig<'tcx>>,
|
||||
{
|
||||
inputs.chain(iter::once(output)).intern_with(|xs| ty::FnSig {
|
||||
T::collect_and_apply(inputs.into_iter().chain(iter::once(output)), |xs| ty::FnSig {
|
||||
inputs_and_output: self.intern_type_list(xs),
|
||||
c_variadic,
|
||||
unsafety,
|
||||
@ -2229,38 +2240,47 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn mk_poly_existential_predicates<
|
||||
I: InternAs<PolyExistentialPredicate<'tcx>, &'tcx List<PolyExistentialPredicate<'tcx>>>,
|
||||
>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_poly_existential_predicates(xs))
|
||||
pub fn mk_poly_existential_predicates<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<
|
||||
PolyExistentialPredicate<'tcx>,
|
||||
&'tcx List<PolyExistentialPredicate<'tcx>>,
|
||||
>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_poly_existential_predicates(xs))
|
||||
}
|
||||
|
||||
pub fn mk_predicates<I: InternAs<Predicate<'tcx>, &'tcx List<Predicate<'tcx>>>>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_predicates(xs))
|
||||
pub fn mk_predicates<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<Predicate<'tcx>, &'tcx List<Predicate<'tcx>>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_predicates(xs))
|
||||
}
|
||||
|
||||
pub fn mk_type_list<I: InternAs<Ty<'tcx>, &'tcx List<Ty<'tcx>>>>(self, iter: I) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_type_list(xs))
|
||||
pub fn mk_type_list<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<Ty<'tcx>, &'tcx List<Ty<'tcx>>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_type_list(xs))
|
||||
}
|
||||
|
||||
pub fn mk_substs<I: InternAs<GenericArg<'tcx>, &'tcx List<GenericArg<'tcx>>>>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_substs(xs))
|
||||
pub fn mk_substs<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<GenericArg<'tcx>, &'tcx List<GenericArg<'tcx>>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_substs(xs))
|
||||
}
|
||||
|
||||
pub fn mk_place_elems<I: InternAs<PlaceElem<'tcx>, &'tcx List<PlaceElem<'tcx>>>>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_place_elems(xs))
|
||||
pub fn mk_place_elems<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<PlaceElem<'tcx>, &'tcx List<PlaceElem<'tcx>>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_place_elems(xs))
|
||||
}
|
||||
|
||||
pub fn mk_substs_trait(
|
||||
@ -2289,13 +2309,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
ty::AliasTy { def_id, substs, _use_mk_alias_ty_instead: () }
|
||||
}
|
||||
|
||||
pub fn mk_bound_variable_kinds<
|
||||
I: InternAs<ty::BoundVariableKind, &'tcx List<ty::BoundVariableKind>>,
|
||||
>(
|
||||
self,
|
||||
iter: I,
|
||||
) -> I::Output {
|
||||
iter.intern_with(|xs| self.intern_bound_variable_kinds(xs))
|
||||
pub fn mk_bound_variable_kinds<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<ty::BoundVariableKind, &'tcx List<ty::BoundVariableKind>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.intern_bound_variable_kinds(xs))
|
||||
}
|
||||
|
||||
/// Emit a lint at `span` from a lint struct (some type that implements `DecorateLint`,
|
||||
@ -2380,13 +2399,13 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
}
|
||||
|
||||
pub fn late_bound_vars(self, id: HirId) -> &'tcx List<ty::BoundVariableKind> {
|
||||
self.mk_bound_variable_kinds(
|
||||
self.late_bound_vars_map(id.owner)
|
||||
self.intern_bound_variable_kinds(
|
||||
&self
|
||||
.late_bound_vars_map(id.owner)
|
||||
.and_then(|map| map.get(&id.local_id).cloned())
|
||||
.unwrap_or_else(|| {
|
||||
bug!("No bound vars found for {}", self.hir().node_to_string(id))
|
||||
})
|
||||
.iter(),
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -686,7 +686,7 @@ where
|
||||
Increase this counter if you tried to implement this but
|
||||
failed to do it without duplicating a lot of code from
|
||||
other places in the compiler: 2
|
||||
tcx.mk_tup(&[
|
||||
tcx.intern_tup(&[
|
||||
tcx.mk_array(tcx.types.usize, 3),
|
||||
tcx.mk_array(Option<fn()>),
|
||||
])
|
||||
|
@ -673,7 +673,7 @@ pub fn super_relate_consts<'tcx, R: TypeRelation<'tcx>>(
|
||||
for (a_arg, b_arg) in aa.iter().zip(ba.iter()) {
|
||||
related_args.push(r.consts(a_arg, b_arg)?);
|
||||
}
|
||||
let related_args = tcx.mk_const_list(related_args.iter());
|
||||
let related_args = tcx.intern_const_list(&related_args);
|
||||
Expr::FunctionCall(func, related_args)
|
||||
}
|
||||
_ => return Err(TypeError::ConstMismatch(expected_found(r, a, b))),
|
||||
|
@ -419,7 +419,7 @@ impl<'tcx> ir::TypeFoldable<TyCtxt<'tcx>> for &'tcx ty::List<ty::PolyExistential
|
||||
|
||||
impl<'tcx> ir::TypeFoldable<TyCtxt<'tcx>> for &'tcx ty::List<ty::Const<'tcx>> {
|
||||
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
|
||||
ty::util::fold_list(self, folder, |tcx, v| tcx.mk_const_list(v.iter()))
|
||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_const_list(v))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,9 +133,9 @@ impl<'tcx> Cx<'tcx> {
|
||||
bug!("closure expr does not have closure type: {:?}", closure_ty);
|
||||
};
|
||||
|
||||
let bound_vars = self.tcx.mk_bound_variable_kinds(std::iter::once(
|
||||
ty::BoundVariableKind::Region(ty::BrEnv),
|
||||
));
|
||||
let bound_vars = self
|
||||
.tcx
|
||||
.intern_bound_variable_kinds(&[ty::BoundVariableKind::Region(ty::BrEnv)]);
|
||||
let br = ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind: ty::BrEnv,
|
||||
|
@ -597,7 +597,7 @@ fn build_call_shim<'tcx>(
|
||||
let untuple_args = sig.inputs();
|
||||
|
||||
// Create substitutions for the `Self` and `Args` generic parameters of the shim body.
|
||||
let arg_tup = tcx.mk_tup(untuple_args.iter());
|
||||
let arg_tup = tcx.intern_tup(untuple_args);
|
||||
|
||||
(Some([ty.into(), arg_tup.into()]), Some(untuple_args))
|
||||
} else {
|
||||
|
@ -781,8 +781,8 @@ fn transform_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, options: TransformTyOptio
|
||||
let output = transform_ty(tcx, fn_sig.skip_binder().output(), options);
|
||||
ty = tcx.mk_fn_ptr(ty::Binder::bind_with_vars(
|
||||
tcx.mk_fn_sig(
|
||||
parameters.iter(),
|
||||
&output,
|
||||
parameters,
|
||||
output,
|
||||
fn_sig.c_variadic(),
|
||||
fn_sig.unsafety(),
|
||||
fn_sig.abi(),
|
||||
@ -813,21 +813,18 @@ fn transform_substs<'tcx>(
|
||||
substs: SubstsRef<'tcx>,
|
||||
options: TransformTyOptions,
|
||||
) -> SubstsRef<'tcx> {
|
||||
let substs: Vec<GenericArg<'tcx>> = substs
|
||||
.iter()
|
||||
.map(|subst| {
|
||||
if let GenericArgKind::Type(ty) = subst.unpack() {
|
||||
if is_c_void_ty(tcx, ty) {
|
||||
tcx.mk_unit().into()
|
||||
} else {
|
||||
transform_ty(tcx, ty, options).into()
|
||||
}
|
||||
let substs = substs.iter().map(|subst| {
|
||||
if let GenericArgKind::Type(ty) = subst.unpack() {
|
||||
if is_c_void_ty(tcx, ty) {
|
||||
tcx.mk_unit().into()
|
||||
} else {
|
||||
subst
|
||||
transform_ty(tcx, ty, options).into()
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
tcx.mk_substs(substs.iter())
|
||||
} else {
|
||||
subst
|
||||
}
|
||||
});
|
||||
tcx.mk_substs(substs)
|
||||
}
|
||||
|
||||
/// Returns a type metadata identifier for the specified FnAbi using the Itanium C++ ABI with vendor
|
||||
|
@ -359,7 +359,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
||||
let b_last_ty = b_tys.last().unwrap();
|
||||
|
||||
// Substitute just the tail field of B., and require that they're equal.
|
||||
let unsized_a_ty = tcx.mk_tup(a_rest_tys.iter().chain([b_last_ty]));
|
||||
let unsized_a_ty = tcx.mk_tup(a_rest_tys.iter().chain([b_last_ty]).copied());
|
||||
let mut nested_goals = ecx.infcx.eq(goal.param_env, unsized_a_ty, b_ty)?;
|
||||
|
||||
// Similar to ADTs, require that the rest of the fields are equal.
|
||||
|
@ -191,10 +191,10 @@ pub(crate) fn extract_tupled_inputs_and_output_from_callable<'tcx>(
|
||||
ty::FnDef(def_id, substs) => Ok(Some(
|
||||
tcx.fn_sig(def_id)
|
||||
.subst(tcx, substs)
|
||||
.map_bound(|sig| (tcx.mk_tup(sig.inputs().iter()), sig.output())),
|
||||
.map_bound(|sig| (tcx.intern_tup(sig.inputs()), sig.output())),
|
||||
)),
|
||||
ty::FnPtr(sig) => {
|
||||
Ok(Some(sig.map_bound(|sig| (tcx.mk_tup(sig.inputs().iter()), sig.output()))))
|
||||
Ok(Some(sig.map_bound(|sig| (tcx.intern_tup(sig.inputs()), sig.output()))))
|
||||
}
|
||||
ty::Closure(_, substs) => {
|
||||
let closure_substs = substs.as_closure();
|
||||
|
@ -2012,7 +2012,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
let sig = match inputs.kind() {
|
||||
ty::Tuple(inputs) if infcx.tcx.is_fn_trait(trait_ref.def_id()) => {
|
||||
infcx.tcx.mk_fn_sig(
|
||||
inputs.iter(),
|
||||
*inputs,
|
||||
infcx.next_ty_var(TypeVariableOrigin {
|
||||
span: DUMMY_SP,
|
||||
kind: TypeVariableOriginKind::MiscVariable,
|
||||
@ -2023,7 +2023,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
)
|
||||
}
|
||||
_ => infcx.tcx.mk_fn_sig(
|
||||
std::iter::once(inputs),
|
||||
[inputs],
|
||||
infcx.next_ty_var(TypeVariableOrigin {
|
||||
span: DUMMY_SP,
|
||||
kind: TypeVariableOriginKind::MiscVariable,
|
||||
|
@ -1923,7 +1923,7 @@ fn confirm_builtin_candidate<'cx, 'tcx>(
|
||||
) -> Progress<'tcx> {
|
||||
let tcx = selcx.tcx();
|
||||
let self_ty = obligation.predicate.self_ty();
|
||||
let substs = tcx.mk_substs([self_ty.into()].iter());
|
||||
let substs = tcx.intern_substs(&[self_ty.into()]);
|
||||
let lang_items = tcx.lang_items();
|
||||
let item_def_id = obligation.predicate.def_id;
|
||||
let trait_def_id = tcx.trait_of_item(item_def_id).unwrap();
|
||||
|
@ -564,10 +564,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
.into()
|
||||
}
|
||||
});
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(bound_vars.into_iter());
|
||||
let bound_vars = tcx.intern_bound_variable_kinds(&bound_vars);
|
||||
let assoc_ty_substs = tcx.intern_substs(&substs);
|
||||
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(bound_vars.into_iter());
|
||||
let bound =
|
||||
bound.map_bound(|b| b.kind().skip_binder()).subst(tcx, assoc_ty_substs);
|
||||
tcx.mk_predicate(ty::Binder::bind_with_vars(bound, bound_vars))
|
||||
|
@ -141,8 +141,8 @@ fn fn_sig_for_fn_abi<'tcx>(
|
||||
|
||||
ty::Binder::bind_with_vars(
|
||||
tcx.mk_fn_sig(
|
||||
[env_ty, resume_ty].iter(),
|
||||
&ret_ty,
|
||||
[env_ty, resume_ty],
|
||||
ret_ty,
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
rustc_target::spec::abi::Abi::Rust,
|
||||
|
@ -144,7 +144,7 @@ fn recurse_build<'tcx>(
|
||||
for &id in args.iter() {
|
||||
new_args.push(recurse_build(tcx, body, id, root_span)?);
|
||||
}
|
||||
let new_args = tcx.mk_const_list(new_args.iter());
|
||||
let new_args = tcx.intern_const_list(&new_args);
|
||||
tcx.mk_const(Expr::FunctionCall(fun, new_args), node.ty)
|
||||
}
|
||||
&ExprKind::Binary { op, lhs, rhs } if check_binop(op) => {
|
||||
|
@ -69,38 +69,37 @@ pub trait Interner: Sized {
|
||||
type PlaceholderRegion: Clone + Debug + Hash + Ord;
|
||||
}
|
||||
|
||||
pub trait InternAs<T: ?Sized, R> {
|
||||
/// Imagine you have a function `F: FnOnce(&[T]) -> R`, plus an iterator `iter`
|
||||
/// that produces `T` items. You could combine them with
|
||||
/// `f(&iter.collect::<Vec<_>>())`, but this requires allocating memory for the
|
||||
/// `Vec`.
|
||||
///
|
||||
/// This trait allows for faster implementations, intended for cases where the
|
||||
/// number of items produced by the iterator is small. There is a blanket impl
|
||||
/// for `T` items, but there is also a fallible impl for `Result<T, E>` items.
|
||||
pub trait CollectAndApply<T, R>: Sized {
|
||||
type Output;
|
||||
fn intern_with<F>(self, f: F) -> Self::Output
|
||||
|
||||
/// Produce a result of type `Self::Output` from `iter`. The result will
|
||||
/// typically be produced by applying `f` on the elements produced by
|
||||
/// `iter`, though this may not happen in some impls, e.g. if an error
|
||||
/// occured during iteration.
|
||||
fn collect_and_apply<I, F>(iter: I, f: F) -> Self::Output
|
||||
where
|
||||
I: Iterator<Item = Self>,
|
||||
F: FnOnce(&[T]) -> R;
|
||||
}
|
||||
|
||||
impl<I, T, R, E> InternAs<T, R> for I
|
||||
where
|
||||
E: InternIteratorElement<T, R>,
|
||||
I: Iterator<Item = E>,
|
||||
{
|
||||
type Output = E::Output;
|
||||
fn intern_with<F>(self, f: F) -> Self::Output
|
||||
/// The blanket impl that always collects all elements and applies `f`.
|
||||
impl<T, R> CollectAndApply<T, R> for T {
|
||||
type Output = R;
|
||||
|
||||
/// Equivalent to `f(&iter.collect::<Vec<_>>())`.
|
||||
fn collect_and_apply<I, F>(mut iter: I, f: F) -> R
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
F: FnOnce(&[T]) -> R,
|
||||
{
|
||||
E::intern_with(self, f)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait InternIteratorElement<T, R>: Sized {
|
||||
type Output;
|
||||
fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output;
|
||||
}
|
||||
|
||||
impl<T, R> InternIteratorElement<T, R> for T {
|
||||
type Output = R;
|
||||
fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(
|
||||
mut iter: I,
|
||||
f: F,
|
||||
) -> Self::Output {
|
||||
// This code is hot enough that it's worth specializing for the most
|
||||
// common length lists, to avoid the overhead of `SmallVec` creation.
|
||||
// Lengths 0, 1, and 2 typically account for ~95% of cases. If
|
||||
@ -127,23 +126,17 @@ impl<T, R> InternIteratorElement<T, R> for T {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T, R> InternIteratorElement<T, R> for &'a T
|
||||
where
|
||||
T: Clone + 'a,
|
||||
{
|
||||
type Output = R;
|
||||
fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
|
||||
// This code isn't hot.
|
||||
f(&iter.cloned().collect::<SmallVec<[_; 8]>>())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
|
||||
/// A fallible impl that will fail, without calling `f`, if there are any
|
||||
/// errors during collection.
|
||||
impl<T, R, E> CollectAndApply<T, R> for Result<T, E> {
|
||||
type Output = Result<R, E>;
|
||||
fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(
|
||||
mut iter: I,
|
||||
f: F,
|
||||
) -> Self::Output {
|
||||
|
||||
/// Equivalent to `Ok(f(&iter.collect::<Result<Vec<_>>>()?))`.
|
||||
fn collect_and_apply<I, F>(mut iter: I, f: F) -> Result<R, E>
|
||||
where
|
||||
I: Iterator<Item = Result<T, E>>,
|
||||
F: FnOnce(&[T]) -> R,
|
||||
{
|
||||
// This code is hot enough that it's worth specializing for the most
|
||||
// common length lists, to avoid the overhead of `SmallVec` creation.
|
||||
// Lengths 0, 1, and 2 typically account for ~95% of cases. If
|
||||
|
@ -173,7 +173,7 @@ fn is_contains_sig(cx: &LateContext<'_>, call_id: HirId, iter_expr: &Expr<'_>) -
|
||||
&& let Some(iter_item) = cx.tcx
|
||||
.associated_items(iter_trait)
|
||||
.find_by_name_and_kind(cx.tcx, Ident::with_dummy_span(Symbol::intern("Item")), AssocKind::Type, iter_trait)
|
||||
&& let substs = cx.tcx.mk_substs([GenericArg::from(typeck.expr_ty_adjusted(iter_expr))].into_iter())
|
||||
&& let substs = cx.tcx.intern_substs(&[GenericArg::from(typeck.expr_ty_adjusted(iter_expr))])
|
||||
&& let proj_ty = cx.tcx.mk_projection(iter_item.def_id, substs)
|
||||
&& let Ok(item_ty) = cx.tcx.try_normalize_erasing_regions(cx.param_env, proj_ty)
|
||||
{
|
||||
|
@ -11,8 +11,6 @@ use rustc_middle::ty::adjustment::{Adjust, AutoBorrow, AutoBorrowMutability};
|
||||
use rustc_middle::ty::subst::GenericArg;
|
||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||
|
||||
use std::iter;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Checks for redundant slicing expressions which use the full range, and
|
||||
@ -136,7 +134,7 @@ impl<'tcx> LateLintPass<'tcx> for RedundantSlicing {
|
||||
} else if let Some(target_id) = cx.tcx.lang_items().deref_target() {
|
||||
if let Ok(deref_ty) = cx.tcx.try_normalize_erasing_regions(
|
||||
cx.param_env,
|
||||
cx.tcx.mk_projection(target_id, cx.tcx.mk_substs(iter::once(GenericArg::from(indexed_ty)))),
|
||||
cx.tcx.mk_projection(target_id, cx.tcx.intern_substs(&[GenericArg::from(indexed_ty)])),
|
||||
) {
|
||||
if deref_ty == expr_ty {
|
||||
let snip = snippet_with_context(cx, indexed.span, ctxt, "..", &mut app).0;
|
||||
|
@ -363,7 +363,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
||||
tcx,
|
||||
ty::ParamEnv::reveal_all(),
|
||||
start_id,
|
||||
tcx.mk_substs(::std::iter::once(ty::subst::GenericArg::from(main_ret_ty))),
|
||||
tcx.intern_substs(&[ty::subst::GenericArg::from(main_ret_ty)]),
|
||||
)
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
|
Loading…
x
Reference in New Issue
Block a user