Auto merge of #124961 - matthiaskrgr:rollup-1jj65p6, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #124551 (Add benchmarks for `impl Debug for str`) - #124915 (`rustc_target` cleanups) - #124918 (Eliminate some `FIXME(lcnr)` comments) - #124927 (opt-dist: use xz2 instead of xz crate) - #124936 (analyse visitor: build proof tree in probe) - #124943 (always use `GenericArgsRef`) - #124955 (Use fewer origins when creating type variables.) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
f7b1501ce7
66 changed files with 366 additions and 467 deletions
11
Cargo.lock
11
Cargo.lock
|
@ -2760,7 +2760,7 @@ dependencies = [
|
|||
"tabled",
|
||||
"tar",
|
||||
"tempfile",
|
||||
"xz",
|
||||
"xz2",
|
||||
"zip",
|
||||
]
|
||||
|
||||
|
@ -6586,15 +6586,6 @@ dependencies = [
|
|||
"rustix",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xz"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c887690ff2a2e233e8e49633461521f98ec57fbff9d59a884c9a4f04ec1da34"
|
||||
dependencies = [
|
||||
"xz2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xz2"
|
||||
version = "0.1.7"
|
||||
|
|
|
@ -26,9 +26,7 @@ pub fn renumber_mir<'tcx>(
|
|||
renumberer.visit_body(body);
|
||||
}
|
||||
|
||||
// FIXME(@lcnr): A lot of these variants overlap and it seems like
|
||||
// this type is only used to decide which region should be used
|
||||
// as representative. This should be cleaned up.
|
||||
// The fields are used only for debugging output in `sccs_info`.
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
|
||||
pub(crate) enum RegionCtxt {
|
||||
Location(Location),
|
||||
|
|
|
@ -11,7 +11,6 @@ use std::assert_matches::assert_matches;
|
|||
|
||||
use itertools::Itertools;
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{BoundRegionConversionTime, RegionVariableOrigin};
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
|
@ -74,9 +73,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
}),
|
||||
);
|
||||
|
||||
let next_ty_var = || {
|
||||
self.infcx.next_ty_var(TypeVariableOrigin { span: body.span, param_def_id: None })
|
||||
};
|
||||
let next_ty_var = || self.infcx.next_ty_var(body.span);
|
||||
let output_ty = Ty::new_coroutine(
|
||||
self.tcx(),
|
||||
self.tcx().coroutine_for_closure(mir_def_id),
|
||||
|
|
|
@ -16,7 +16,6 @@ use rustc_index::{IndexSlice, IndexVec};
|
|||
use rustc_infer::infer::canonical::QueryRegionConstraints;
|
||||
use rustc_infer::infer::outlives::env::RegionBoundPairs;
|
||||
use rustc_infer::infer::region_constraints::RegionConstraintData;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{
|
||||
BoundRegion, BoundRegionConversionTime, InferCtxt, NllRegionVariableOrigin,
|
||||
};
|
||||
|
@ -2356,10 +2355,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
// Types with regions are comparable if they have a common super-type.
|
||||
ty::RawPtr(_, _) | ty::FnPtr(_) => {
|
||||
let ty_right = right.ty(body, tcx);
|
||||
let common_ty = self.infcx.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: body.source_info(location).span,
|
||||
});
|
||||
let common_ty = self.infcx.next_ty_var(body.source_info(location).span);
|
||||
self.sub_types(
|
||||
ty_left,
|
||||
common_ty,
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::NllRegionVariableOrigin;
|
||||
use rustc_infer::infer::{ObligationEmittingRelation, StructurallyRelateAliases};
|
||||
use rustc_infer::traits::{Obligation, PredicateObligations};
|
||||
|
@ -129,10 +128,7 @@ impl<'me, 'bccx, 'tcx> NllTypeRelating<'me, 'bccx, 'tcx> {
|
|||
// by using `ty_vid rel B` and then finally and end by equating `ty_vid` to
|
||||
// the opaque.
|
||||
let mut enable_subtyping = |ty, opaque_is_expected| {
|
||||
let ty_vid = infcx.next_ty_var_id_in_universe(
|
||||
TypeVariableOrigin { param_def_id: None, span: self.span() },
|
||||
ty::UniverseIndex::ROOT,
|
||||
);
|
||||
let ty_vid = infcx.next_ty_var_id_in_universe(self.span(), ty::UniverseIndex::ROOT);
|
||||
|
||||
let variance = if opaque_is_expected {
|
||||
self.ambient_variance
|
||||
|
|
|
@ -9,7 +9,6 @@ use rustc_hir::def::{DefKind, Res};
|
|||
use rustc_hir::intravisit;
|
||||
use rustc_hir::{GenericParamKind, ImplItemKind};
|
||||
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
|
||||
use rustc_infer::traits::{util, FulfillmentError};
|
||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||
|
@ -800,10 +799,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ImplTraitInTraitCollector<'_, 'tcx> {
|
|||
bug!("FIXME(RPITIT): error here");
|
||||
}
|
||||
// Replace with infer var
|
||||
let infer_ty = self
|
||||
.ocx
|
||||
.infcx
|
||||
.next_ty_var(TypeVariableOrigin { span: self.span, param_def_id: None });
|
||||
let infer_ty = self.ocx.infcx.next_ty_var(self.span);
|
||||
self.types.insert(proj.def_id, (infer_ty, proj.args));
|
||||
// Recurse into bounds
|
||||
for (pred, pred_span) in self
|
||||
|
|
|
@ -5,7 +5,6 @@ use rustc_hir::def::{CtorOf, DefKind, Res};
|
|||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::{self as hir, ExprKind, PatKind};
|
||||
use rustc_hir_pretty::ty_to_string;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_span::Span;
|
||||
use rustc_trait_selection::traits::{
|
||||
|
@ -67,7 +66,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// arm for inconsistent arms or to the whole match when a `()` type
|
||||
// is required).
|
||||
Expectation::ExpectHasType(ety) if ety != tcx.types.unit => ety,
|
||||
_ => self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr.span }),
|
||||
_ => self.next_ty_var(expr.span),
|
||||
};
|
||||
CoerceMany::with_coercion_sites(coerce_first, arms)
|
||||
};
|
||||
|
@ -575,8 +574,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// ...but otherwise we want to use any supertype of the
|
||||
// scrutinee. This is sort of a workaround, see note (*) in
|
||||
// `check_pat` for some details.
|
||||
let scrut_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: scrut.span });
|
||||
let scrut_ty = self.next_ty_var(scrut.span);
|
||||
self.check_expr_has_type_or_error(scrut, scrut_ty, |_| {});
|
||||
scrut_ty
|
||||
}
|
||||
|
|
|
@ -11,9 +11,8 @@ use rustc_hir::def_id::DefId;
|
|||
use rustc_hir_analysis::autoderef::Autoderef;
|
||||
use rustc_infer::{
|
||||
infer,
|
||||
traits::{self, Obligation},
|
||||
traits::{self, Obligation, ObligationCause},
|
||||
};
|
||||
use rustc_infer::{infer::type_variable::TypeVariableOrigin, traits::ObligationCause};
|
||||
use rustc_middle::ty::adjustment::{
|
||||
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability,
|
||||
};
|
||||
|
@ -180,14 +179,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
infer::FnCall,
|
||||
closure_args.coroutine_closure_sig(),
|
||||
);
|
||||
let tupled_upvars_ty = self
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: callee_expr.span });
|
||||
let tupled_upvars_ty = self.next_ty_var(callee_expr.span);
|
||||
// We may actually receive a coroutine back whose kind is different
|
||||
// from the closure that this dispatched from. This is because when
|
||||
// we have no captures, we automatically implement `FnOnce`. This
|
||||
// impl forces the closure kind to `FnOnce` i.e. `u8`.
|
||||
let kind_ty = self
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: callee_expr.span });
|
||||
let kind_ty = self.next_ty_var(callee_expr.span);
|
||||
let call_sig = self.tcx.mk_fn_sig(
|
||||
[coroutine_closure_sig.tupled_inputs_ty],
|
||||
coroutine_closure_sig.to_coroutine(
|
||||
|
@ -298,12 +295,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let Some(trait_def_id) = opt_trait_def_id else { continue };
|
||||
|
||||
let opt_input_type = opt_arg_exprs.map(|arg_exprs| {
|
||||
Ty::new_tup_from_iter(
|
||||
self.tcx,
|
||||
arg_exprs.iter().map(|e| {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: e.span })
|
||||
}),
|
||||
)
|
||||
Ty::new_tup_from_iter(self.tcx, arg_exprs.iter().map(|e| self.next_ty_var(e.span)))
|
||||
});
|
||||
|
||||
if let Some(ok) = self.lookup_method_in_trait(
|
||||
|
|
|
@ -8,7 +8,6 @@ use rustc_hir::def::DefKind;
|
|||
use rustc_hir::intravisit::Visitor;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir_analysis::check::{check_function_signature, forbid_intrinsic_abi};
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::RegionVariableOrigin;
|
||||
use rustc_infer::traits::WellFormedLoc;
|
||||
use rustc_middle::ty::{self, Binder, Ty, TyCtxt};
|
||||
|
@ -142,7 +141,7 @@ pub(super) fn check_fn<'a, 'tcx>(
|
|||
// We have special-cased the case where the function is declared
|
||||
// `-> dyn Foo` and we don't actually relate it to the
|
||||
// `fcx.ret_coercion`, so just instantiate a type variable.
|
||||
actual_return_ty = fcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span });
|
||||
actual_return_ty = fcx.next_ty_var(span);
|
||||
debug!("actual_return_ty replaced with {:?}", actual_return_ty);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@ use rustc_errors::ErrorGuaranteed;
|
|||
use rustc_hir as hir;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{BoundRegionConversionTime, DefineOpaqueTypes};
|
||||
use rustc_infer::infer::{InferOk, InferResult};
|
||||
use rustc_macros::{TypeFoldable, TypeVisitable};
|
||||
|
@ -73,8 +72,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let parent_args =
|
||||
GenericArgs::identity_for_item(tcx, tcx.typeck_root_def_id(expr_def_id.to_def_id()));
|
||||
|
||||
let tupled_upvars_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let tupled_upvars_ty = self.next_ty_var(expr_span);
|
||||
|
||||
// FIXME: We could probably actually just unify this further --
|
||||
// instead of having a `FnSig` and a `Option<CoroutineTypes>`,
|
||||
|
@ -101,9 +99,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
// Create a type variable (for now) to represent the closure kind.
|
||||
// It will be unified during the upvar inference phase (`upvar.rs`)
|
||||
None => {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span })
|
||||
}
|
||||
None => self.next_ty_var(expr_span),
|
||||
};
|
||||
|
||||
let closure_args = ty::ClosureArgs::new(
|
||||
|
@ -122,10 +118,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let yield_ty = match kind {
|
||||
hir::CoroutineKind::Desugared(hir::CoroutineDesugaring::Gen, _)
|
||||
| hir::CoroutineKind::Coroutine(_) => {
|
||||
let yield_ty = self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: expr_span,
|
||||
});
|
||||
let yield_ty = self.next_ty_var(expr_span);
|
||||
self.require_type_is_sized(yield_ty, expr_span, traits::SizedYieldType);
|
||||
yield_ty
|
||||
}
|
||||
|
@ -134,10 +127,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// in this block in projection correctly. In the new trait solver, it is
|
||||
// not a problem.
|
||||
hir::CoroutineKind::Desugared(hir::CoroutineDesugaring::AsyncGen, _) => {
|
||||
let yield_ty = self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: expr_span,
|
||||
});
|
||||
let yield_ty = self.next_ty_var(expr_span);
|
||||
self.require_type_is_sized(yield_ty, expr_span, traits::SizedYieldType);
|
||||
|
||||
Ty::new_adt(
|
||||
|
@ -163,8 +153,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// Resume type defaults to `()` if the coroutine has no argument.
|
||||
let resume_ty = liberated_sig.inputs().get(0).copied().unwrap_or(tcx.types.unit);
|
||||
|
||||
let interior =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let interior = self.next_ty_var(expr_span);
|
||||
self.deferred_coroutine_interiors.borrow_mut().push((
|
||||
expr_def_id,
|
||||
body.id(),
|
||||
|
@ -177,7 +166,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// ty of `().`
|
||||
let kind_ty = match kind {
|
||||
hir::CoroutineKind::Desugared(_, hir::CoroutineSource::Closure) => {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span })
|
||||
self.next_ty_var(expr_span)
|
||||
}
|
||||
_ => tcx.types.unit,
|
||||
};
|
||||
|
@ -212,23 +201,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
};
|
||||
// Compute all of the variables that will be used to populate the coroutine.
|
||||
let resume_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let interior =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let resume_ty = self.next_ty_var(expr_span);
|
||||
let interior = self.next_ty_var(expr_span);
|
||||
|
||||
let closure_kind_ty = match expected_kind {
|
||||
Some(kind) => Ty::from_closure_kind(tcx, kind),
|
||||
|
||||
// Create a type variable (for now) to represent the closure kind.
|
||||
// It will be unified during the upvar inference phase (`upvar.rs`)
|
||||
None => {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span })
|
||||
}
|
||||
None => self.next_ty_var(expr_span),
|
||||
};
|
||||
|
||||
let coroutine_captures_by_ref_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let coroutine_captures_by_ref_ty = self.next_ty_var(expr_span);
|
||||
let closure_args = ty::CoroutineClosureArgs::new(
|
||||
tcx,
|
||||
ty::CoroutineClosureArgsParts {
|
||||
|
@ -260,13 +244,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
// Create a type variable (for now) to represent the closure kind.
|
||||
// It will be unified during the upvar inference phase (`upvar.rs`)
|
||||
None => {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span })
|
||||
}
|
||||
None => self.next_ty_var(expr_span),
|
||||
};
|
||||
|
||||
let coroutine_upvars_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr_span });
|
||||
let coroutine_upvars_ty = self.next_ty_var(expr_span);
|
||||
|
||||
// We need to turn the liberated signature that we got from HIR, which
|
||||
// looks something like `|Args...| -> T`, into a signature that is suitable
|
||||
|
|
|
@ -41,7 +41,6 @@ use rustc_errors::{codes::*, struct_span_code_err, Applicability, Diag};
|
|||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{Coercion, DefineOpaqueTypes, InferOk, InferResult};
|
||||
use rustc_infer::traits::{IfExpressionCause, MatchExpressionArmCause};
|
||||
use rustc_infer::traits::{Obligation, PredicateObligation};
|
||||
|
@ -257,11 +256,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
|||
|
||||
if b.is_ty_var() {
|
||||
// Two unresolved type variables: create a `Coerce` predicate.
|
||||
let target_ty = if self.use_lub {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: self.cause.span })
|
||||
} else {
|
||||
b
|
||||
};
|
||||
let target_ty = if self.use_lub { self.next_ty_var(self.cause.span) } else { b };
|
||||
|
||||
let mut obligations = Vec::with_capacity(2);
|
||||
for &source_ty in &[a, b] {
|
||||
|
@ -557,8 +552,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
|||
// the `CoerceUnsized` target type and the expected type.
|
||||
// We only have the latter, so we use an inference variable
|
||||
// for the former and let type inference do the rest.
|
||||
let origin = TypeVariableOrigin { param_def_id: None, span: self.cause.span };
|
||||
let coerce_target = self.next_ty_var(origin);
|
||||
let coerce_target = self.next_ty_var(self.cause.span);
|
||||
let mut coercion = self.unify_and(coerce_target, target, |target| {
|
||||
let unsize = Adjustment { kind: Adjust::Pointer(PointerCoercion::Unsize), target };
|
||||
match reborrow {
|
||||
|
|
|
@ -330,16 +330,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
hir.body(hir.maybe_body_owned_by(self.body_id).expect("expected item to have body"));
|
||||
expr_finder.visit_expr(body.value);
|
||||
|
||||
use rustc_infer::infer::type_variable::*;
|
||||
use rustc_middle::infer::unify_key::*;
|
||||
// Replaces all of the variables in the given type with a fresh inference variable.
|
||||
let mut fudger = BottomUpFolder {
|
||||
tcx: self.tcx,
|
||||
ty_op: |ty| {
|
||||
if let ty::Infer(infer) = ty.kind() {
|
||||
match infer {
|
||||
ty::TyVar(_) => self
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: DUMMY_SP }),
|
||||
ty::TyVar(_) => self.next_ty_var(DUMMY_SP),
|
||||
ty::IntVar(_) => self.next_int_var(),
|
||||
ty::FloatVar(_) => self.next_float_var(),
|
||||
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {
|
||||
|
@ -353,10 +350,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
lt_op: |_| self.tcx.lifetimes.re_erased,
|
||||
ct_op: |ct| {
|
||||
if let ty::ConstKind::Infer(_) = ct.kind() {
|
||||
self.next_const_var(
|
||||
ct.ty(),
|
||||
ConstVariableOrigin { param_def_id: None, span: DUMMY_SP },
|
||||
)
|
||||
self.next_const_var(ct.ty(), DUMMY_SP)
|
||||
} else {
|
||||
ct
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_span::Span;
|
||||
|
||||
|
@ -110,7 +109,6 @@ impl<'a, 'tcx> Expectation<'tcx> {
|
|||
/// Like `only_has_type`, but instead of returning `None` if no
|
||||
/// hard constraint exists, creates a fresh type variable.
|
||||
pub(super) fn coercion_target_type(self, fcx: &FnCtxt<'a, 'tcx>, span: Span) -> Ty<'tcx> {
|
||||
self.only_has_type(fcx)
|
||||
.unwrap_or_else(|| fcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span }))
|
||||
self.only_has_type(fcx).unwrap_or_else(|| fcx.next_ty_var(span))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,6 @@ use rustc_hir::lang_items::LangItem;
|
|||
use rustc_hir::{ExprKind, HirId, QPath};
|
||||
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer as _;
|
||||
use rustc_infer::infer;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::DefineOpaqueTypes;
|
||||
use rustc_infer::infer::InferOk;
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
|
@ -80,8 +79,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
return Ty::new_error(self.tcx(), reported);
|
||||
}
|
||||
|
||||
let adj_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr.span });
|
||||
let adj_ty = self.next_ty_var(expr.span);
|
||||
self.apply_adjustments(
|
||||
expr,
|
||||
vec![Adjustment { kind: Adjust::NeverToAny, target: adj_ty }],
|
||||
|
@ -1412,9 +1410,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
ty::Array(ty, _) | ty::Slice(ty) => Some(ty),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr.span })
|
||||
});
|
||||
.unwrap_or_else(|| self.next_ty_var(expr.span));
|
||||
let mut coerce = CoerceMany::with_coercion_sites(coerce_to, args);
|
||||
assert_eq!(self.diverges.get(), Diverges::Maybe);
|
||||
for e in args {
|
||||
|
@ -1424,7 +1420,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
coerce.complete(self)
|
||||
} else {
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: expr.span })
|
||||
self.next_ty_var(expr.span)
|
||||
};
|
||||
let array_len = args.len() as u64;
|
||||
self.suggest_array_len(expr, array_len);
|
||||
|
@ -1507,8 +1503,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
(uty, uty)
|
||||
}
|
||||
None => {
|
||||
let ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: element.span });
|
||||
let ty = self.next_ty_var(element.span);
|
||||
let element_ty = self.check_expr_has_type_or_error(element, ty, |_| {});
|
||||
(element_ty, ty)
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
|||
use rustc_hir_analysis::structured_errors::StructuredDiag;
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_infer::infer::error_reporting::{FailureCode, ObligationCauseExt};
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::TypeTrace;
|
||||
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
||||
use rustc_middle::traits::ObligationCauseCode::ExprBindingObligation;
|
||||
|
@ -40,7 +39,7 @@ use rustc_middle::ty::visit::TypeVisitableExt;
|
|||
use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt};
|
||||
use rustc_session::Session;
|
||||
use rustc_span::symbol::{kw, Ident};
|
||||
use rustc_span::{sym, BytePos, Span};
|
||||
use rustc_span::{sym, BytePos, Span, DUMMY_SP};
|
||||
use rustc_trait_selection::traits::{self, ObligationCauseCode, SelectionContext};
|
||||
|
||||
use std::iter;
|
||||
|
@ -2180,13 +2179,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let trait_ref = ty::TraitRef::new(
|
||||
self.tcx,
|
||||
self.tcx.fn_trait_kind_to_def_id(call_kind)?,
|
||||
[
|
||||
callee_ty,
|
||||
self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: rustc_span::DUMMY_SP,
|
||||
}),
|
||||
],
|
||||
[callee_ty, self.next_ty_var(DUMMY_SP)],
|
||||
);
|
||||
let obligation = traits::Obligation::new(
|
||||
self.tcx,
|
||||
|
|
|
@ -19,8 +19,6 @@ use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
|||
use rustc_infer::infer;
|
||||
use rustc_infer::infer::error_reporting::sub_relations::SubRelations;
|
||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_middle::ty::{self, Const, Ty, TyCtxt, TypeVisitableExt};
|
||||
use rustc_session::Session;
|
||||
use rustc_span::symbol::Ident;
|
||||
|
@ -239,7 +237,7 @@ impl<'a, 'tcx> HirTyLowerer<'tcx> for FnCtxt<'a, 'tcx> {
|
|||
fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
|
||||
match param {
|
||||
Some(param) => self.var_for_def(span, param).as_type().unwrap(),
|
||||
None => self.next_ty_var(TypeVariableOrigin { param_def_id: None, span }),
|
||||
None => self.next_ty_var(span),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -258,7 +256,7 @@ impl<'a, 'tcx> HirTyLowerer<'tcx> for FnCtxt<'a, 'tcx> {
|
|||
},
|
||||
) => self.var_for_effect(param).as_const().unwrap(),
|
||||
Some(param) => self.var_for_def(span, param).as_const().unwrap(),
|
||||
None => self.next_const_var(ty, ConstVariableOrigin { span, param_def_id: None }),
|
||||
None => self.next_const_var(ty, span),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ use crate::FnCtxt;
|
|||
use rustc_hir as hir;
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{HirId, PatKind};
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::ty::Ty;
|
||||
use rustc_middle::ty::UserType;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
|
@ -72,7 +71,7 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
|||
match ty_opt {
|
||||
None => {
|
||||
// Infer the variable's type.
|
||||
let var_ty = self.fcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span });
|
||||
let var_ty = self.fcx.next_ty_var(span);
|
||||
self.fcx.locals.borrow_mut().insert(nid, var_ty);
|
||||
var_ty
|
||||
}
|
||||
|
|
|
@ -60,7 +60,6 @@ use rustc_hir::intravisit::Visitor;
|
|||
use rustc_hir::{HirId, HirIdMap, Node};
|
||||
use rustc_hir_analysis::check::check_abi;
|
||||
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::traits::{ObligationCauseCode, ObligationInspector, WellFormedLoc};
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::traits;
|
||||
|
@ -246,7 +245,7 @@ fn infer_type_if_missing<'tcx>(fcx: &FnCtxt<'_, 'tcx>, node: Node<'tcx>) -> Opti
|
|||
tcx.impl_trait_ref(item.container_id(tcx)).unwrap().instantiate_identity().args;
|
||||
Some(tcx.type_of(trait_item).instantiate(tcx, args))
|
||||
} else {
|
||||
Some(fcx.next_ty_var(TypeVariableOrigin { span, param_def_id: None }))
|
||||
Some(fcx.next_ty_var(span))
|
||||
}
|
||||
} else if let Node::AnonConst(_) = node {
|
||||
let id = tcx.local_def_id_to_hir_id(def_id);
|
||||
|
@ -254,7 +253,7 @@ fn infer_type_if_missing<'tcx>(fcx: &FnCtxt<'_, 'tcx>, node: Node<'tcx>) -> Opti
|
|||
Node::Ty(&hir::Ty { kind: hir::TyKind::Typeof(ref anon_const), span, .. })
|
||||
if anon_const.hir_id == id =>
|
||||
{
|
||||
Some(fcx.next_ty_var(TypeVariableOrigin { span, param_def_id: None }))
|
||||
Some(fcx.next_ty_var(span))
|
||||
}
|
||||
Node::Expr(&hir::Expr { kind: hir::ExprKind::InlineAsm(asm), span, .. })
|
||||
| Node::Item(&hir::Item { kind: hir::ItemKind::GlobalAsm(asm), span, .. }) => {
|
||||
|
@ -264,7 +263,7 @@ fn infer_type_if_missing<'tcx>(fcx: &FnCtxt<'_, 'tcx>, node: Node<'tcx>) -> Opti
|
|||
Some(fcx.next_int_var())
|
||||
}
|
||||
hir::InlineAsmOperand::SymFn { anon_const } if anon_const.hir_id == id => {
|
||||
Some(fcx.next_ty_var(TypeVariableOrigin { span, param_def_id: None }))
|
||||
Some(fcx.next_ty_var(span))
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
|
|
|
@ -315,7 +315,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
trait_def_id: DefId,
|
||||
self_ty: Ty<'tcx>,
|
||||
opt_input_types: Option<&[Ty<'tcx>]>,
|
||||
) -> (traits::PredicateObligation<'tcx>, &'tcx ty::List<ty::GenericArg<'tcx>>) {
|
||||
) -> (traits::PredicateObligation<'tcx>, ty::GenericArgsRef<'tcx>) {
|
||||
// Construct a trait-reference `self_ty : Trait<input_tys>`
|
||||
let args = GenericArgs::for_item(self.tcx, trait_def_id, |param, _| {
|
||||
match param.kind {
|
||||
|
@ -365,7 +365,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
m_name: Ident,
|
||||
trait_def_id: DefId,
|
||||
obligation: traits::PredicateObligation<'tcx>,
|
||||
args: &'tcx ty::List<ty::GenericArg<'tcx>>,
|
||||
args: ty::GenericArgsRef<'tcx>,
|
||||
) -> Option<InferOk<'tcx, MethodCallee<'tcx>>> {
|
||||
debug!(?obligation);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ use hir::HirId;
|
|||
use hir::ItemKind;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_session::lint::builtin::RUST_2021_PRELUDE_COLLISIONS;
|
||||
use rustc_span::symbol::kw::{Empty, Underscore};
|
||||
|
@ -218,8 +217,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// If we know it does not, we don't need to warn.
|
||||
if method_name.name == sym::from_iter {
|
||||
if let Some(trait_def_id) = self.tcx.get_diagnostic_item(sym::FromIterator) {
|
||||
let any_type =
|
||||
self.infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span });
|
||||
let any_type = self.infcx.next_ty_var(span);
|
||||
if !self
|
||||
.infcx
|
||||
.type_implements_trait(trait_def_id, [self_ty, any_type], self.param_env)
|
||||
|
|
|
@ -22,8 +22,7 @@ use rustc_hir::lang_items::LangItem;
|
|||
use rustc_hir::PatKind::Binding;
|
||||
use rustc_hir::PathSegment;
|
||||
use rustc_hir::{ExprKind, Node, QPath};
|
||||
use rustc_infer::infer::{self, type_variable::TypeVariableOrigin, RegionVariableOrigin};
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_infer::infer::{self, RegionVariableOrigin};
|
||||
use rustc_middle::ty::fast_reject::DeepRejectCtxt;
|
||||
use rustc_middle::ty::fast_reject::{simplify_type, TreatParams};
|
||||
use rustc_middle::ty::print::{with_crate_prefix, with_forced_trimmed_paths};
|
||||
|
@ -75,11 +74,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.autoderef(span, ty).any(|(ty, _)| {
|
||||
info!("check deref {:?} impl FnOnce", ty);
|
||||
self.probe(|_| {
|
||||
let trait_ref = ty::TraitRef::new(
|
||||
tcx,
|
||||
fn_once,
|
||||
[ty, self.next_ty_var(TypeVariableOrigin { param_def_id: None, span })],
|
||||
);
|
||||
let trait_ref =
|
||||
ty::TraitRef::new(tcx, fn_once, [ty, self.next_ty_var(span)]);
|
||||
let poly_trait_ref = ty::Binder::dummy(trait_ref);
|
||||
let obligation = Obligation::misc(
|
||||
tcx,
|
||||
|
@ -1259,12 +1255,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
args.map(|args| {
|
||||
args.iter()
|
||||
.map(|expr| {
|
||||
self.node_ty_opt(expr.hir_id).unwrap_or_else(|| {
|
||||
self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: expr.span,
|
||||
})
|
||||
})
|
||||
self.node_ty_opt(expr.hir_id).unwrap_or_else(|| self.next_ty_var(expr.span))
|
||||
})
|
||||
.collect()
|
||||
}),
|
||||
|
@ -1846,18 +1837,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
GenericArgKind::Lifetime(_) => self
|
||||
.next_region_var(RegionVariableOrigin::MiscVariable(DUMMY_SP))
|
||||
.into(),
|
||||
GenericArgKind::Type(_) => self
|
||||
.next_ty_var(TypeVariableOrigin {
|
||||
span: DUMMY_SP,
|
||||
param_def_id: None,
|
||||
})
|
||||
.into(),
|
||||
GenericArgKind::Const(arg) => self
|
||||
.next_const_var(
|
||||
arg.ty(),
|
||||
ConstVariableOrigin { span: DUMMY_SP, param_def_id: None },
|
||||
)
|
||||
.into(),
|
||||
GenericArgKind::Type(_) => self.next_ty_var(DUMMY_SP).into(),
|
||||
GenericArgKind::Const(arg) => {
|
||||
self.next_const_var(arg.ty(), DUMMY_SP).into()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
arg
|
||||
|
|
|
@ -7,7 +7,6 @@ use rustc_ast as ast;
|
|||
use rustc_data_structures::packed::Pu128;
|
||||
use rustc_errors::{codes::*, struct_span_code_err, Applicability, Diag};
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::traits::ObligationCauseCode;
|
||||
use rustc_middle::ty::adjustment::{
|
||||
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability,
|
||||
|
@ -219,8 +218,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// e.g., adding `&'a T` and `&'b T`, given `&'x T: Add<&'x T>`, will result
|
||||
// in `&'a T <: &'x T` and `&'b T <: &'x T`, instead of `'a = 'b = 'x`.
|
||||
let lhs_ty = self.check_expr(lhs_expr);
|
||||
let fresh_var = self
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: lhs_expr.span });
|
||||
let fresh_var = self.next_ty_var(lhs_expr.span);
|
||||
self.demand_coerce(lhs_expr, lhs_ty, fresh_var, Some(rhs_expr), AllowTwoPhase::No)
|
||||
}
|
||||
IsAssign::Yes => {
|
||||
|
@ -239,8 +237,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// using this variable as the expected type, which sometimes lets
|
||||
// us do better coercions than we would be able to do otherwise,
|
||||
// particularly for things like `String + &String`.
|
||||
let rhs_ty_var =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: rhs_expr.span });
|
||||
let rhs_ty_var = self.next_ty_var(rhs_expr.span);
|
||||
|
||||
let result = self.lookup_op_method(
|
||||
(lhs_expr, lhs_ty),
|
||||
|
|
|
@ -9,7 +9,6 @@ use rustc_hir::def::{CtorKind, DefKind, Res};
|
|||
use rustc_hir::pat_util::EnumerateAndAdjustIterator;
|
||||
use rustc_hir::{self as hir, BindingMode, ByRef, HirId, Mutability, Pat, PatKind};
|
||||
use rustc_infer::infer;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
|
||||
use rustc_session::lint::builtin::NON_EXHAUSTIVE_OMITTED_PATTERNS;
|
||||
|
@ -1419,8 +1418,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
let max_len = cmp::max(expected_len, elements.len());
|
||||
|
||||
let element_tys_iter =
|
||||
(0..max_len).map(|_| self.next_ty_var(TypeVariableOrigin { param_def_id: None, span }));
|
||||
let element_tys_iter = (0..max_len).map(|_| self.next_ty_var(span));
|
||||
let element_tys = tcx.mk_type_list_from_iter(element_tys_iter);
|
||||
let pat_ty = Ty::new_tup(tcx, element_tys);
|
||||
if let Some(err) = self.demand_eqtype_pat_diag(span, expected, pat_ty, pat_info.top_info) {
|
||||
|
@ -1676,7 +1674,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
unmentioned_fields: &mut Vec<(&'tcx ty::FieldDef, Ident)>,
|
||||
pat: &'tcx Pat<'tcx>,
|
||||
variant: &ty::VariantDef,
|
||||
args: &'tcx ty::List<ty::GenericArg<'tcx>>,
|
||||
args: ty::GenericArgsRef<'tcx>,
|
||||
) -> Diag<'tcx> {
|
||||
let tcx = self.tcx;
|
||||
let (field_names, t, plural) = if let [field] = inexistent_fields {
|
||||
|
@ -2046,8 +2044,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
Ok(()) => {
|
||||
// Here, `demand::subtype` is good enough, but I don't
|
||||
// think any errors can be introduced by using `demand::eqtype`.
|
||||
let inner_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: inner.span });
|
||||
let inner_ty = self.next_ty_var(inner.span);
|
||||
let box_ty = Ty::new_box(tcx, inner_ty);
|
||||
self.demand_eqtype_pat(span, expected, box_ty, pat_info.top_info);
|
||||
(box_ty, inner_ty)
|
||||
|
@ -2142,10 +2139,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
.insert(pat.hir_id);
|
||||
(expected, expected)
|
||||
} else {
|
||||
let inner_ty = self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: inner.span,
|
||||
});
|
||||
let inner_ty = self.next_ty_var(inner.span);
|
||||
let ref_ty = self.new_ref_ty(pat.span, mutbl, inner_ty);
|
||||
debug!("check_pat_ref: demanding {:?} = {:?}", expected, ref_ty);
|
||||
let err = self.demand_eqtype_pat_diag(
|
||||
|
@ -2194,8 +2188,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
let tcx = self.tcx;
|
||||
let len = before.len();
|
||||
let ty_var_origin = TypeVariableOrigin { param_def_id: None, span };
|
||||
let inner_ty = self.next_ty_var(ty_var_origin);
|
||||
let inner_ty = self.next_ty_var(span);
|
||||
|
||||
Some(Ty::new_array(tcx, inner_ty, len.try_into().unwrap()))
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ use rustc_ast as ast;
|
|||
use rustc_errors::Applicability;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir_analysis::autoderef::Autoderef;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::InferOk;
|
||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, OverloadedDeref, PointerCoercion};
|
||||
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
|
||||
|
@ -147,8 +146,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// If some lookup succeeds, write callee into table and extract index/element
|
||||
// type from the method signature.
|
||||
// If some lookup succeeded, install method in table
|
||||
let input_ty =
|
||||
self.next_ty_var(TypeVariableOrigin { param_def_id: None, span: base_expr.span });
|
||||
let input_ty = self.next_ty_var(base_expr.span);
|
||||
let method =
|
||||
self.try_overloaded_place_op(expr.span, self_ty, &[input_ty], PlaceOp::Index);
|
||||
|
||||
|
|
|
@ -69,16 +69,8 @@ impl<'a> DescriptionCtx<'a> {
|
|||
|
||||
ty::RePlaceholder(_) | ty::ReError(_) => return None,
|
||||
|
||||
// FIXME(#13998) RePlaceholder should probably print like
|
||||
// ReLateParam rather than dumping Debug output on the user.
|
||||
//
|
||||
// We shouldn't really be having unification failures with ReVar
|
||||
// and ReBound though.
|
||||
//
|
||||
// FIXME(@lcnr): figure out why we have to handle `ReBound`
|
||||
// here, this feels somewhat off.
|
||||
ty::ReVar(_) | ty::ReBound(..) | ty::ReErased => {
|
||||
(alt_span, "revar", format!("{region:?}"))
|
||||
bug!("unexpected region for DescriptionCtx: {:?}", region);
|
||||
}
|
||||
};
|
||||
Some(DescriptionCtx { span, kind, arg })
|
||||
|
|
|
@ -21,8 +21,7 @@
|
|||
//!
|
||||
//! [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html
|
||||
|
||||
use crate::infer::ConstVariableOrigin;
|
||||
use crate::infer::{InferCtxt, RegionVariableOrigin, TypeVariableOrigin};
|
||||
use crate::infer::{InferCtxt, RegionVariableOrigin};
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_middle::infer::unify_key::EffectVarValue;
|
||||
use rustc_middle::ty::fold::TypeFoldable;
|
||||
|
@ -114,10 +113,9 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
match cv_info.kind {
|
||||
CanonicalVarKind::Ty(ty_kind) => {
|
||||
let ty = match ty_kind {
|
||||
CanonicalTyVarKind::General(ui) => self.next_ty_var_in_universe(
|
||||
TypeVariableOrigin { param_def_id: None, span },
|
||||
universe_map(ui),
|
||||
),
|
||||
CanonicalTyVarKind::General(ui) => {
|
||||
self.next_ty_var_in_universe(span, universe_map(ui))
|
||||
}
|
||||
|
||||
CanonicalTyVarKind::Int => self.next_int_var(),
|
||||
|
||||
|
@ -145,13 +143,9 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
ty::Region::new_placeholder(self.tcx, placeholder_mapped).into()
|
||||
}
|
||||
|
||||
CanonicalVarKind::Const(ui, ty) => self
|
||||
.next_const_var_in_universe(
|
||||
ty,
|
||||
ConstVariableOrigin { param_def_id: None, span },
|
||||
universe_map(ui),
|
||||
)
|
||||
.into(),
|
||||
CanonicalVarKind::Const(ui, ty) => {
|
||||
self.next_const_var_in_universe(ty, span, universe_map(ui)).into()
|
||||
}
|
||||
CanonicalVarKind::Effect => {
|
||||
let vid = self
|
||||
.inner
|
||||
|
|
|
@ -172,11 +172,9 @@ pub(super) fn note_and_explain_region<'tcx>(
|
|||
|
||||
ty::ReError(_) => return,
|
||||
|
||||
// We shouldn't really be having unification failures with ReVar
|
||||
// and ReBound though.
|
||||
//
|
||||
// FIXME(@lcnr): Figure out whether this is reachable and if so, why.
|
||||
ty::ReVar(_) | ty::ReBound(..) | ty::ReErased => (format!("lifetime `{region}`"), alt_span),
|
||||
ty::ReVar(_) | ty::ReBound(..) | ty::ReErased => {
|
||||
bug!("unexpected region for note_and_explain_region: {:?}", region);
|
||||
}
|
||||
};
|
||||
|
||||
emit_msg_span(err, prefix, description, span, suffix);
|
||||
|
|
|
@ -3,7 +3,6 @@ use crate::errors::{
|
|||
SourceKindMultiSuggestion, SourceKindSubdiag,
|
||||
};
|
||||
use crate::infer::error_reporting::TypeErrCtxt;
|
||||
use crate::infer::type_variable::TypeVariableOrigin;
|
||||
use crate::infer::InferCtxt;
|
||||
use rustc_errors::{codes::*, Diag, IntoDiagArg};
|
||||
use rustc_hir as hir;
|
||||
|
@ -13,7 +12,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{Body, Closure, Expr, ExprKind, FnRetTy, HirId, LetStmt, LocalSource};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableValue};
|
||||
use rustc_middle::infer::unify_key::ConstVariableValue;
|
||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow};
|
||||
use rustc_middle::ty::print::{FmtPrinter, PrettyPrinter, Print, Printer};
|
||||
use rustc_middle::ty::{
|
||||
|
@ -542,18 +541,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
|
||||
match arg.unpack() {
|
||||
GenericArgKind::Lifetime(_) => bug!("unexpected lifetime"),
|
||||
GenericArgKind::Type(_) => self
|
||||
.next_ty_var(TypeVariableOrigin {
|
||||
span: DUMMY_SP,
|
||||
param_def_id: None,
|
||||
})
|
||||
.into(),
|
||||
GenericArgKind::Const(arg) => self
|
||||
.next_const_var(
|
||||
arg.ty(),
|
||||
ConstVariableOrigin { span: DUMMY_SP, param_def_id: None },
|
||||
)
|
||||
.into(),
|
||||
GenericArgKind::Type(_) => self.next_ty_var(DUMMY_SP).into(),
|
||||
GenericArgKind::Const(arg) => {
|
||||
self.next_const_var(arg.ty(), DUMMY_SP).into()
|
||||
}
|
||||
}
|
||||
}))
|
||||
.unwrap();
|
||||
|
@ -569,9 +560,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
}
|
||||
InferSourceKind::FullyQualifiedMethodCall { receiver, successor, args, def_id } => {
|
||||
let placeholder = Some(
|
||||
self.next_ty_var(TypeVariableOrigin { span: DUMMY_SP, param_def_id: None }),
|
||||
);
|
||||
let placeholder = Some(self.next_ty_var(DUMMY_SP));
|
||||
if let Some(args) = args.make_suggestable(self.infcx.tcx, true, placeholder) {
|
||||
let mut printer = fmt_printer(self, Namespace::ValueNS);
|
||||
printer.print_def_path(def_id, args).unwrap();
|
||||
|
@ -605,9 +594,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
}
|
||||
InferSourceKind::ClosureReturn { ty, data, should_wrap_expr } => {
|
||||
let placeholder = Some(
|
||||
self.next_ty_var(TypeVariableOrigin { span: DUMMY_SP, param_def_id: None }),
|
||||
);
|
||||
let placeholder = Some(self.next_ty_var(DUMMY_SP));
|
||||
if let Some(ty) = ty.make_suggestable(self.infcx.tcx, true, placeholder) {
|
||||
let ty_info = ty_to_string(self, ty, None);
|
||||
multi_suggestions.push(SourceKindMultiSuggestion::new_closure_return(
|
||||
|
|
|
@ -528,8 +528,8 @@ pub enum RegionVariableOrigin {
|
|||
|
||||
/// Region variables created as the values for early-bound regions.
|
||||
///
|
||||
/// FIXME(@lcnr): This can also store a `DefId`, similar to
|
||||
/// `TypeVariableOriginKind::TypeParameterDefinition`.
|
||||
/// FIXME(@lcnr): This should also store a `DefId`, similar to
|
||||
/// `TypeVariableOrigin`.
|
||||
RegionParameterDefinition(Span, Symbol),
|
||||
|
||||
/// Region variables created when instantiating a binder with
|
||||
|
@ -989,41 +989,50 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
self.inner.borrow_mut().type_variables().num_vars()
|
||||
}
|
||||
|
||||
pub fn next_ty_var_id(&self, origin: TypeVariableOrigin) -> TyVid {
|
||||
self.inner.borrow_mut().type_variables().new_var(self.universe(), origin)
|
||||
pub fn next_ty_var(&self, span: Span) -> Ty<'tcx> {
|
||||
self.next_ty_var_with_origin(TypeVariableOrigin { span, param_def_id: None })
|
||||
}
|
||||
|
||||
pub fn next_ty_var(&self, origin: TypeVariableOrigin) -> Ty<'tcx> {
|
||||
Ty::new_var(self.tcx, self.next_ty_var_id(origin))
|
||||
}
|
||||
|
||||
pub fn next_ty_var_id_in_universe(
|
||||
&self,
|
||||
origin: TypeVariableOrigin,
|
||||
universe: ty::UniverseIndex,
|
||||
) -> TyVid {
|
||||
self.inner.borrow_mut().type_variables().new_var(universe, origin)
|
||||
}
|
||||
|
||||
pub fn next_ty_var_in_universe(
|
||||
&self,
|
||||
origin: TypeVariableOrigin,
|
||||
universe: ty::UniverseIndex,
|
||||
) -> Ty<'tcx> {
|
||||
let vid = self.next_ty_var_id_in_universe(origin, universe);
|
||||
pub fn next_ty_var_with_origin(&self, origin: TypeVariableOrigin) -> Ty<'tcx> {
|
||||
let vid = self.inner.borrow_mut().type_variables().new_var(self.universe(), origin);
|
||||
Ty::new_var(self.tcx, vid)
|
||||
}
|
||||
|
||||
pub fn next_const_var(&self, ty: Ty<'tcx>, origin: ConstVariableOrigin) -> ty::Const<'tcx> {
|
||||
ty::Const::new_var(self.tcx, self.next_const_var_id(origin), ty)
|
||||
pub fn next_ty_var_id_in_universe(&self, span: Span, universe: ty::UniverseIndex) -> TyVid {
|
||||
let origin = TypeVariableOrigin { span, param_def_id: None };
|
||||
self.inner.borrow_mut().type_variables().new_var(universe, origin)
|
||||
}
|
||||
|
||||
pub fn next_ty_var_in_universe(&self, span: Span, universe: ty::UniverseIndex) -> Ty<'tcx> {
|
||||
let vid = self.next_ty_var_id_in_universe(span, universe);
|
||||
Ty::new_var(self.tcx, vid)
|
||||
}
|
||||
|
||||
pub fn next_const_var(&self, ty: Ty<'tcx>, span: Span) -> ty::Const<'tcx> {
|
||||
self.next_const_var_with_origin(ty, ConstVariableOrigin { span, param_def_id: None })
|
||||
}
|
||||
|
||||
pub fn next_const_var_with_origin(
|
||||
&self,
|
||||
ty: Ty<'tcx>,
|
||||
origin: ConstVariableOrigin,
|
||||
) -> ty::Const<'tcx> {
|
||||
let vid = self
|
||||
.inner
|
||||
.borrow_mut()
|
||||
.const_unification_table()
|
||||
.new_key(ConstVariableValue::Unknown { origin, universe: self.universe() })
|
||||
.vid;
|
||||
ty::Const::new_var(self.tcx, vid, ty)
|
||||
}
|
||||
|
||||
pub fn next_const_var_in_universe(
|
||||
&self,
|
||||
ty: Ty<'tcx>,
|
||||
origin: ConstVariableOrigin,
|
||||
span: Span,
|
||||
universe: ty::UniverseIndex,
|
||||
) -> ty::Const<'tcx> {
|
||||
let origin = ConstVariableOrigin { span, param_def_id: None };
|
||||
let vid = self
|
||||
.inner
|
||||
.borrow_mut()
|
||||
|
@ -1033,28 +1042,14 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
ty::Const::new_var(self.tcx, vid, ty)
|
||||
}
|
||||
|
||||
pub fn next_const_var_id(&self, origin: ConstVariableOrigin) -> ConstVid {
|
||||
self.inner
|
||||
.borrow_mut()
|
||||
.const_unification_table()
|
||||
.new_key(ConstVariableValue::Unknown { origin, universe: self.universe() })
|
||||
.vid
|
||||
}
|
||||
|
||||
fn next_int_var_id(&self) -> IntVid {
|
||||
self.inner.borrow_mut().int_unification_table().new_key(None)
|
||||
}
|
||||
|
||||
pub fn next_int_var(&self) -> Ty<'tcx> {
|
||||
Ty::new_int_var(self.tcx, self.next_int_var_id())
|
||||
}
|
||||
|
||||
fn next_float_var_id(&self) -> FloatVid {
|
||||
self.inner.borrow_mut().float_unification_table().new_key(None)
|
||||
let vid = self.inner.borrow_mut().int_unification_table().new_key(None);
|
||||
Ty::new_int_var(self.tcx, vid)
|
||||
}
|
||||
|
||||
pub fn next_float_var(&self) -> Ty<'tcx> {
|
||||
Ty::new_float_var(self.tcx, self.next_float_var_id())
|
||||
let vid = self.inner.borrow_mut().float_unification_table().new_key(None);
|
||||
Ty::new_float_var(self.tcx, vid)
|
||||
}
|
||||
|
||||
/// Creates a fresh region variable with the next available index.
|
||||
|
@ -1468,24 +1463,13 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
fn replace_ty(&mut self, bt: ty::BoundTy) -> Ty<'tcx> {
|
||||
self.map
|
||||
.entry(bt.var)
|
||||
.or_insert_with(|| {
|
||||
self.infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: self.span })
|
||||
.into()
|
||||
})
|
||||
.or_insert_with(|| self.infcx.next_ty_var(self.span).into())
|
||||
.expect_ty()
|
||||
}
|
||||
fn replace_const(&mut self, bv: ty::BoundVar, ty: Ty<'tcx>) -> ty::Const<'tcx> {
|
||||
self.map
|
||||
.entry(bv)
|
||||
.or_insert_with(|| {
|
||||
self.infcx
|
||||
.next_const_var(
|
||||
ty,
|
||||
ConstVariableOrigin { param_def_id: None, span: self.span },
|
||||
)
|
||||
.into()
|
||||
})
|
||||
.or_insert_with(|| self.infcx.next_const_var(ty, self.span).into())
|
||||
.expect_const()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use super::type_variable::TypeVariableOrigin;
|
||||
use super::{DefineOpaqueTypes, InferResult};
|
||||
use crate::errors::OpaqueHiddenTypeDiag;
|
||||
use crate::infer::{InferCtxt, InferOk};
|
||||
|
@ -65,7 +64,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
let span = if span.contains(def_span) { def_span } else { span };
|
||||
let code = traits::ObligationCauseCode::OpaqueReturnType(None);
|
||||
let cause = ObligationCause::new(span, body_id, code);
|
||||
let ty_var = self.next_ty_var(TypeVariableOrigin { param_def_id: None, span });
|
||||
let ty_var = self.next_ty_var(span);
|
||||
obligations.extend(
|
||||
self.handle_opaque_type(ty, ty_var, &cause, param_env).unwrap().obligations,
|
||||
);
|
||||
|
|
|
@ -3,7 +3,6 @@ use rustc_middle::ty::{self, Ty};
|
|||
|
||||
use crate::traits::{Obligation, PredicateObligation};
|
||||
|
||||
use super::type_variable::TypeVariableOrigin;
|
||||
use super::InferCtxt;
|
||||
|
||||
impl<'tcx> InferCtxt<'tcx> {
|
||||
|
@ -23,10 +22,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
) -> Ty<'tcx> {
|
||||
debug_assert!(!self.next_trait_solver());
|
||||
let def_id = projection_ty.def_id;
|
||||
let ty_var = self.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: self.tcx.def_span(def_id),
|
||||
});
|
||||
let ty_var = self.next_ty_var(self.tcx.def_span(def_id));
|
||||
let projection = ty::Binder::dummy(ty::PredicateKind::Clause(ty::ClauseKind::Projection(
|
||||
ty::ProjectionPredicate { projection_ty, term: ty_var.into() },
|
||||
)));
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use std::mem;
|
||||
|
||||
use super::StructurallyRelateAliases;
|
||||
use crate::infer::type_variable::{TypeVariableOrigin, TypeVariableValue};
|
||||
use crate::infer::type_variable::TypeVariableValue;
|
||||
use crate::infer::{InferCtxt, ObligationEmittingRelation, RegionVariableOrigin};
|
||||
use rustc_data_structures::sso::SsoHashMap;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
|
@ -357,10 +357,7 @@ impl<'tcx> Generalizer<'_, 'tcx> {
|
|||
//
|
||||
// cc trait-system-refactor-initiative#110
|
||||
if self.infcx.next_trait_solver() && !alias.has_escaping_bound_vars() && !self.in_alias {
|
||||
return Ok(self.infcx.next_ty_var_in_universe(
|
||||
TypeVariableOrigin { param_def_id: None, span: self.span },
|
||||
self.for_universe,
|
||||
));
|
||||
return Ok(self.infcx.next_ty_var_in_universe(self.span, self.for_universe));
|
||||
}
|
||||
|
||||
let is_nested_alias = mem::replace(&mut self.in_alias, true);
|
||||
|
@ -380,10 +377,7 @@ impl<'tcx> Generalizer<'_, 'tcx> {
|
|||
}
|
||||
|
||||
debug!("generalization failure in alias");
|
||||
Ok(self.infcx.next_ty_var_in_universe(
|
||||
TypeVariableOrigin { param_def_id: None, span: self.span },
|
||||
self.for_universe,
|
||||
))
|
||||
Ok(self.infcx.next_ty_var_in_universe(self.span, self.for_universe))
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
//! [lattices]: https://en.wikipedia.org/wiki/Lattice_(order)
|
||||
|
||||
use super::combine::ObligationEmittingRelation;
|
||||
use crate::infer::type_variable::TypeVariableOrigin;
|
||||
use crate::infer::{DefineOpaqueTypes, InferCtxt};
|
||||
use crate::traits::ObligationCause;
|
||||
|
||||
|
@ -88,14 +87,12 @@ where
|
|||
// iterate on the subtype obligations that are returned, but I
|
||||
// think this suffices. -nmatsakis
|
||||
(&ty::Infer(TyVar(..)), _) => {
|
||||
let v = infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: this.cause().span });
|
||||
let v = infcx.next_ty_var(this.cause().span);
|
||||
this.relate_bound(v, b, a)?;
|
||||
Ok(v)
|
||||
}
|
||||
(_, &ty::Infer(TyVar(..))) => {
|
||||
let v = infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: this.cause().span });
|
||||
let v = infcx.next_ty_var(this.cause().span);
|
||||
this.relate_bound(v, a, b)?;
|
||||
Ok(v)
|
||||
}
|
||||
|
|
|
@ -195,7 +195,7 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceFudger<'a, 'tcx> {
|
|||
// Recreate it with a fresh variable here.
|
||||
let idx = vid.as_usize() - self.type_vars.0.start.as_usize();
|
||||
let origin = self.type_vars.1[idx];
|
||||
self.infcx.next_ty_var(origin)
|
||||
self.infcx.next_ty_var_with_origin(origin)
|
||||
} else {
|
||||
// This variable was created before the
|
||||
// "fudging". Since we refresh all type
|
||||
|
@ -244,7 +244,7 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceFudger<'a, 'tcx> {
|
|||
// Recreate it with a fresh variable here.
|
||||
let idx = vid.index() - self.const_vars.0.start.index();
|
||||
let origin = self.const_vars.1[idx];
|
||||
self.infcx.next_const_var(ct.ty(), origin)
|
||||
self.infcx.next_const_var_with_origin(ct.ty(), origin)
|
||||
} else {
|
||||
ct
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ use crate::{
|
|||
use hir::{Expr, Pat};
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::{infer::TyCtxtInferExt, traits::ObligationCause};
|
||||
use rustc_middle::ty::{self, List};
|
||||
use rustc_middle::ty;
|
||||
use rustc_session::{declare_lint, declare_lint_pass};
|
||||
use rustc_span::{sym, Span};
|
||||
use rustc_trait_selection::traits::ObligationCtxt;
|
||||
|
@ -123,7 +123,7 @@ fn extract_iterator_next_call<'tcx>(
|
|||
fn suggest_question_mark<'tcx>(
|
||||
cx: &LateContext<'tcx>,
|
||||
adt: ty::AdtDef<'tcx>,
|
||||
args: &List<ty::GenericArg<'tcx>>,
|
||||
args: ty::GenericArgsRef<'tcx>,
|
||||
span: Span,
|
||||
) -> bool {
|
||||
let Some(body_id) = cx.enclosing_body else { return false };
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
use rustc_hir::{def::DefKind, Body, Item, ItemKind, Node, TyKind};
|
||||
use rustc_hir::{Path, QPath};
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::InferCtxt;
|
||||
use rustc_infer::traits::{Obligation, ObligationCause};
|
||||
use rustc_middle::ty::{self, Binder, Ty, TyCtxt, TypeFoldable, TypeFolder};
|
||||
|
@ -337,7 +336,7 @@ impl<'a, 'tcx, F: FnMut(DefId) -> bool> TypeFolder<TyCtxt<'tcx>>
|
|||
if let Some(def) = t.ty_adt_def()
|
||||
&& (self.did_has_local_parent)(def.did())
|
||||
{
|
||||
self.infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span: self.infer_span })
|
||||
self.infcx.next_ty_var(self.infer_span)
|
||||
} else {
|
||||
t.super_fold_with(self)
|
||||
}
|
||||
|
|
|
@ -2331,7 +2331,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
pub fn mk_args_from_iter<I, T>(self, iter: I) -> T::Output
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
T: CollectAndApply<GenericArg<'tcx>, &'tcx List<GenericArg<'tcx>>>,
|
||||
T: CollectAndApply<GenericArg<'tcx>, ty::GenericArgsRef<'tcx>>,
|
||||
{
|
||||
T::collect_and_apply(iter, |xs| self.mk_args(xs))
|
||||
}
|
||||
|
|
|
@ -100,8 +100,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
/// codegen, we need to normalize the contents.
|
||||
// FIXME(@lcnr): This method should not be necessary, we now normalize
|
||||
// inside of binders. We should be able to only use
|
||||
// `tcx.instantiate_bound_regions_with_erased`. Same for the `try_X`
|
||||
// variant.
|
||||
// `tcx.instantiate_bound_regions_with_erased`.
|
||||
#[tracing::instrument(level = "debug", skip(self, param_env))]
|
||||
pub fn normalize_erasing_late_bound_regions<T>(
|
||||
self,
|
||||
|
@ -115,26 +114,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self.normalize_erasing_regions(param_env, value)
|
||||
}
|
||||
|
||||
/// If you have a `Binder<'tcx, T>`, you can do this to strip out the
|
||||
/// late-bound regions and then normalize the result, yielding up
|
||||
/// a `T` (with regions erased). This is appropriate when the
|
||||
/// binder is being instantiated at the call site.
|
||||
///
|
||||
/// N.B., currently, higher-ranked type bounds inhibit
|
||||
/// normalization. Therefore, each time we erase them in
|
||||
/// codegen, we need to normalize the contents.
|
||||
pub fn try_normalize_erasing_late_bound_regions<T>(
|
||||
self,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
value: ty::Binder<'tcx, T>,
|
||||
) -> Result<T, NormalizationError<'tcx>>
|
||||
where
|
||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||
{
|
||||
let value = self.instantiate_bound_regions_with_erased(value);
|
||||
self.try_normalize_erasing_regions(param_env, value)
|
||||
}
|
||||
|
||||
/// Monomorphizes a type from the AST by first applying the
|
||||
/// in-scope instantiations and then normalizing any associated
|
||||
/// types.
|
||||
|
|
|
@ -977,7 +977,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
|
|||
fn pretty_print_opaque_impl_type(
|
||||
&mut self,
|
||||
def_id: DefId,
|
||||
args: &'tcx ty::List<ty::GenericArg<'tcx>>,
|
||||
args: ty::GenericArgsRef<'tcx>,
|
||||
) -> Result<(), PrintError> {
|
||||
let tcx = self.tcx();
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ use crate::build::expr::as_place::{PlaceBase, PlaceBuilder};
|
|||
use crate::build::matches::{Binding, Candidate, FlatPat, MatchPair, TestCase};
|
||||
use crate::build::Builder;
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::thir::{self, *};
|
||||
use rustc_middle::ty::TypeVisitableExt;
|
||||
|
@ -180,9 +179,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
|
|||
cx.tcx,
|
||||
ty::InlineConstArgsParts {
|
||||
parent_args: ty::GenericArgs::identity_for_item(cx.tcx, parent_id),
|
||||
ty: cx
|
||||
.infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span }),
|
||||
ty: cx.infcx.next_ty_var(span),
|
||||
},
|
||||
)
|
||||
.args;
|
||||
|
|
|
@ -7,16 +7,17 @@
|
|||
//! more 'stuff' here in the future. It does not have a dependency on
|
||||
//! LLVM.
|
||||
|
||||
// tidy-alphabetical-start
|
||||
#![allow(internal_features)]
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![doc(rust_logo)]
|
||||
#![feature(min_exhaustive_patterns)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(assert_matches)]
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(min_exhaustive_patterns)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(step_trait)]
|
||||
#![allow(internal_features)]
|
||||
#![feature(rustdoc_internals)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
|
|
|
@ -603,19 +603,6 @@ impl LinkSelfContainedDefault {
|
|||
self == LinkSelfContainedDefault::False
|
||||
}
|
||||
|
||||
/// Returns whether the target spec explicitly requests self-contained linking, i.e. not via
|
||||
/// inference.
|
||||
pub fn is_linker_enabled(self) -> bool {
|
||||
match self {
|
||||
LinkSelfContainedDefault::True => true,
|
||||
LinkSelfContainedDefault::False => false,
|
||||
LinkSelfContainedDefault::WithComponents(c) => {
|
||||
c.contains(LinkSelfContainedComponents::LINKER)
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the key to use when serializing the setting to json:
|
||||
/// - individual components in a `link-self-contained` object value
|
||||
/// - the other variants as a backwards-compatible `crt-objects-fallback` string
|
||||
|
|
|
@ -19,12 +19,10 @@ use rustc_infer::infer::canonical::query_response::make_query_region_constraints
|
|||
use rustc_infer::infer::canonical::CanonicalVarValues;
|
||||
use rustc_infer::infer::canonical::{CanonicalExt, QueryRegionConstraints};
|
||||
use rustc_infer::infer::resolve::EagerResolver;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::RegionVariableOrigin;
|
||||
use rustc_infer::infer::{InferCtxt, InferOk};
|
||||
use rustc_infer::traits::solve::NestedNormalizationGoals;
|
||||
use rustc_middle::infer::canonical::Canonical;
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_middle::traits::query::NoSolution;
|
||||
use rustc_middle::traits::solve::{
|
||||
ExternalConstraintsData, MaybeCause, PredefinedOpaquesData, QueryInput,
|
||||
|
@ -409,6 +407,7 @@ pub(in crate::solve) fn make_canonical_state<'tcx, T: TypeFoldable<TyCtxt<'tcx>>
|
|||
/// This currently assumes that unifying the var values trivially succeeds.
|
||||
/// Adding any inference constraints which weren't present when originally
|
||||
/// computing the canonical query can result in bugs.
|
||||
#[instrument(level = "debug", skip(infcx, span, param_env))]
|
||||
pub(in crate::solve) fn instantiate_canonical_state<'tcx, T: TypeFoldable<TyCtxt<'tcx>>>(
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
span: Span,
|
||||
|
@ -424,12 +423,8 @@ pub(in crate::solve) fn instantiate_canonical_state<'tcx, T: TypeFoldable<TyCtxt
|
|||
ty::GenericArgKind::Lifetime(_) => {
|
||||
infcx.next_region_var(RegionVariableOrigin::MiscVariable(span)).into()
|
||||
}
|
||||
ty::GenericArgKind::Type(_) => {
|
||||
infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span }).into()
|
||||
}
|
||||
ty::GenericArgKind::Const(ct) => infcx
|
||||
.next_const_var(ct.ty(), ConstVariableOrigin { param_def_id: None, span })
|
||||
.into(),
|
||||
ty::GenericArgKind::Type(_) => infcx.next_ty_var(span).into(),
|
||||
ty::GenericArgKind::Const(ct) => infcx.next_const_var(ct.ty(), span).into(),
|
||||
};
|
||||
|
||||
orig_values.push(unconstrained);
|
||||
|
|
|
@ -2,7 +2,6 @@ use rustc_data_structures::stack::ensure_sufficient_stack;
|
|||
use rustc_hir::def_id::DefId;
|
||||
use rustc_infer::infer::at::ToTrace;
|
||||
use rustc_infer::infer::canonical::CanonicalVarValues;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{
|
||||
BoundRegionConversionTime, DefineOpaqueTypes, InferCtxt, InferOk, TyCtxtInferExt,
|
||||
};
|
||||
|
@ -11,7 +10,6 @@ use rustc_infer::traits::solve::{MaybeCause, NestedNormalizationGoals};
|
|||
use rustc_infer::traits::ObligationCause;
|
||||
use rustc_macros::{extension, HashStable};
|
||||
use rustc_middle::infer::canonical::CanonicalVarInfos;
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_middle::traits::solve::inspect;
|
||||
use rustc_middle::traits::solve::{
|
||||
CanonicalInput, CanonicalResponse, Certainty, PredefinedOpaques, PredefinedOpaquesData,
|
||||
|
@ -600,15 +598,13 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||
}
|
||||
|
||||
pub(super) fn next_ty_infer(&mut self) -> Ty<'tcx> {
|
||||
let ty = self.infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span: DUMMY_SP });
|
||||
let ty = self.infcx.next_ty_var(DUMMY_SP);
|
||||
self.inspect.add_var_value(ty);
|
||||
ty
|
||||
}
|
||||
|
||||
pub(super) fn next_const_infer(&mut self, ty: Ty<'tcx>) -> ty::Const<'tcx> {
|
||||
let ct = self
|
||||
.infcx
|
||||
.next_const_var(ty, ConstVariableOrigin { param_def_id: None, span: DUMMY_SP });
|
||||
let ct = self.infcx.next_const_var(ty, DUMMY_SP);
|
||||
self.inspect.add_var_value(ct);
|
||||
ct
|
||||
}
|
||||
|
|
|
@ -12,10 +12,8 @@
|
|||
use rustc_ast_ir::try_visit;
|
||||
use rustc_ast_ir::visit::VisitorResult;
|
||||
use rustc_infer::infer::resolve::EagerResolver;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
|
||||
use rustc_macros::extension;
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_middle::traits::query::NoSolution;
|
||||
use rustc_middle::traits::solve::{inspect, QueryResult};
|
||||
use rustc_middle::traits::solve::{Certainty, Goal};
|
||||
|
@ -146,6 +144,11 @@ impl<'a, 'tcx> InspectCandidate<'a, 'tcx> {
|
|||
/// inference constraints, and optionally the args of an impl if this candidate
|
||||
/// came from a `CandidateSource::Impl`. This function modifies the state of the
|
||||
/// `infcx`.
|
||||
#[instrument(
|
||||
level = "debug",
|
||||
skip_all,
|
||||
fields(goal = ?self.goal.goal, nested_goals = ?self.nested_goals)
|
||||
)]
|
||||
pub fn instantiate_nested_goals_and_opt_impl_args(
|
||||
&self,
|
||||
span: Span,
|
||||
|
@ -201,22 +204,28 @@ impl<'a, 'tcx> InspectCandidate<'a, 'tcx> {
|
|||
.map(|(source, goal)| match goal.predicate.kind().no_bound_vars() {
|
||||
Some(ty::PredicateKind::NormalizesTo(ty::NormalizesTo { alias, term })) => {
|
||||
let unconstrained_term = match term.unpack() {
|
||||
ty::TermKind::Ty(_) => infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span })
|
||||
.into(),
|
||||
ty::TermKind::Const(ct) => infcx
|
||||
.next_const_var(
|
||||
ct.ty(),
|
||||
ConstVariableOrigin { param_def_id: None, span },
|
||||
)
|
||||
.into(),
|
||||
ty::TermKind::Ty(_) => infcx.next_ty_var(span).into(),
|
||||
ty::TermKind::Const(ct) => infcx.next_const_var(ct.ty(), span).into(),
|
||||
};
|
||||
let goal =
|
||||
goal.with(infcx.tcx, ty::NormalizesTo { alias, term: unconstrained_term });
|
||||
let proof_tree = EvalCtxt::enter_root(infcx, GenerateProofTree::Yes, |ecx| {
|
||||
ecx.evaluate_goal_raw(GoalEvaluationKind::Root, GoalSource::Misc, goal)
|
||||
})
|
||||
.1;
|
||||
// We have to use a `probe` here as evaluating a `NormalizesTo` can constrain the
|
||||
// expected term. This means that candidates which only fail due to nested goals
|
||||
// and which normalize to a different term then the final result could ICE: when
|
||||
// building their proof tree, the expected term was unconstrained, but when
|
||||
// instantiating the candidate it is already constrained to the result of another
|
||||
// candidate.
|
||||
let proof_tree = infcx
|
||||
.probe(|_| {
|
||||
EvalCtxt::enter_root(infcx, GenerateProofTree::Yes, |ecx| {
|
||||
ecx.evaluate_goal_raw(
|
||||
GoalEvaluationKind::Root,
|
||||
GoalSource::Misc,
|
||||
goal,
|
||||
)
|
||||
})
|
||||
})
|
||||
.1;
|
||||
InspectGoal::new(
|
||||
infcx,
|
||||
self.goal.depth + 1,
|
||||
|
@ -225,13 +234,17 @@ impl<'a, 'tcx> InspectCandidate<'a, 'tcx> {
|
|||
source,
|
||||
)
|
||||
}
|
||||
_ => InspectGoal::new(
|
||||
infcx,
|
||||
self.goal.depth + 1,
|
||||
infcx.evaluate_root_goal(goal, GenerateProofTree::Yes).1.unwrap(),
|
||||
None,
|
||||
source,
|
||||
),
|
||||
_ => {
|
||||
// We're using a probe here as evaluating a goal could constrain
|
||||
// inference variables by choosing one candidate. If we then recurse
|
||||
// into another candidate who ends up with different inference
|
||||
// constraints, we get an ICE if we already applied the constraints
|
||||
// from the chosen candidate.
|
||||
let proof_tree = infcx
|
||||
.probe(|_| infcx.evaluate_root_goal(goal, GenerateProofTree::Yes).1)
|
||||
.unwrap();
|
||||
InspectGoal::new(infcx, self.goal.depth + 1, proof_tree, None, source)
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
|
|
|
@ -3,11 +3,9 @@ use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
|||
use crate::traits::{BoundVarReplacer, PlaceholderReplacer};
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_infer::infer::at::At;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::InferCtxt;
|
||||
use rustc_infer::traits::TraitEngineExt;
|
||||
use rustc_infer::traits::{FulfillmentError, Obligation, TraitEngine};
|
||||
use rustc_middle::infer::unify_key::ConstVariableOrigin;
|
||||
use rustc_middle::traits::ObligationCause;
|
||||
use rustc_middle::ty::{self, AliasTy, Ty, TyCtxt, UniverseIndex};
|
||||
use rustc_middle::ty::{FallibleTypeFolder, TypeFolder, TypeSuperFoldable};
|
||||
|
@ -74,8 +72,7 @@ impl<'tcx> NormalizationFolder<'_, 'tcx> {
|
|||
|
||||
self.depth += 1;
|
||||
|
||||
let new_infer_ty =
|
||||
infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span: self.at.cause.span });
|
||||
let new_infer_ty = infcx.next_ty_var(self.at.cause.span);
|
||||
let obligation = Obligation::new(
|
||||
tcx,
|
||||
self.at.cause.clone(),
|
||||
|
@ -120,10 +117,7 @@ impl<'tcx> NormalizationFolder<'_, 'tcx> {
|
|||
|
||||
self.depth += 1;
|
||||
|
||||
let new_infer_ct = infcx.next_const_var(
|
||||
ty,
|
||||
ConstVariableOrigin { param_def_id: None, span: self.at.cause.span },
|
||||
);
|
||||
let new_infer_ct = infcx.next_const_var(ty, self.at.cause.span);
|
||||
let obligation = Obligation::new(
|
||||
tcx,
|
||||
self.at.cause.clone(),
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use crate::infer::type_variable::TypeVariableOrigin;
|
||||
use crate::infer::InferCtxt;
|
||||
use crate::traits::{Obligation, ObligationCause, ObligationCtxt};
|
||||
use rustc_errors::{codes::*, pluralize, struct_span_code_err, Applicability, Diag};
|
||||
|
@ -218,8 +217,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
let Some(trait_def_id) = trait_def_id else { continue };
|
||||
// Make a fresh inference variable so we can determine what the generic parameters
|
||||
// of the trait are.
|
||||
let var =
|
||||
self.next_ty_var(TypeVariableOrigin { span: DUMMY_SP, param_def_id: None });
|
||||
let var = self.next_ty_var(DUMMY_SP);
|
||||
// FIXME(effects)
|
||||
let trait_ref = ty::TraitRef::new(self.tcx, trait_def_id, [ty.skip_binder(), var]);
|
||||
let obligation = Obligation::new(
|
||||
|
|
|
@ -24,7 +24,6 @@ use rustc_hir::is_range_literal;
|
|||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{CoroutineDesugaring, CoroutineKind, CoroutineSource, Expr, HirId, Node};
|
||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::{BoundRegionConversionTime, DefineOpaqueTypes, InferOk};
|
||||
use rustc_macros::extension;
|
||||
use rustc_middle::hir::map;
|
||||
|
@ -1893,8 +1892,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
ty::Tuple(inputs) if infcx.tcx.is_fn_trait(trait_ref.def_id) => {
|
||||
infcx.tcx.mk_fn_sig(
|
||||
*inputs,
|
||||
infcx
|
||||
.next_ty_var(TypeVariableOrigin { span: DUMMY_SP, param_def_id: None }),
|
||||
infcx.next_ty_var(DUMMY_SP),
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
abi::Abi::Rust,
|
||||
|
@ -1902,7 +1900,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
_ => infcx.tcx.mk_fn_sig(
|
||||
[inputs],
|
||||
infcx.next_ty_var(TypeVariableOrigin { span: DUMMY_SP, param_def_id: None }),
|
||||
infcx.next_ty_var(DUMMY_SP),
|
||||
false,
|
||||
hir::Unsafety::Normal,
|
||||
abi::Abi::Rust,
|
||||
|
@ -4263,7 +4261,6 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
continue;
|
||||
};
|
||||
|
||||
let origin = TypeVariableOrigin { param_def_id: None, span };
|
||||
// Make `Self` be equivalent to the type of the call chain
|
||||
// expression we're looking at now, so that we can tell what
|
||||
// for example `Iterator::Item` is at this point in the chain.
|
||||
|
@ -4277,7 +4274,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
// This will hold the resolved type of the associated type, if the
|
||||
// current expression implements the trait that associated type is
|
||||
// in. For example, this would be what `Iterator::Item` is here.
|
||||
let ty = self.infcx.next_ty_var(origin);
|
||||
let ty = self.infcx.next_ty_var(span);
|
||||
// This corresponds to `<ExprTy as Iterator>::Item = _`.
|
||||
let projection = ty::Binder::dummy(ty::PredicateKind::Clause(
|
||||
ty::ClauseKind::Projection(ty::ProjectionPredicate {
|
||||
|
|
|
@ -6,7 +6,6 @@ use crate::errors::{
|
|||
AsyncClosureNotFn, ClosureFnMutLabel, ClosureFnOnceLabel, ClosureKindMismatch,
|
||||
};
|
||||
use crate::infer::error_reporting::{TyCategory, TypeAnnotationNeeded as ErrorCode};
|
||||
use crate::infer::type_variable::TypeVariableOrigin;
|
||||
use crate::infer::InferCtxtExt as _;
|
||||
use crate::infer::{self, InferCtxt};
|
||||
use crate::traits::error_reporting::infer_ctxt_ext::InferCtxtExt;
|
||||
|
@ -2826,9 +2825,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
if let ty::Param(_) = *ty.kind() {
|
||||
let infcx = self.infcx;
|
||||
*self.var_map.entry(ty).or_insert_with(|| {
|
||||
infcx.next_ty_var(TypeVariableOrigin { param_def_id: None, span: DUMMY_SP })
|
||||
})
|
||||
*self.var_map.entry(ty).or_insert_with(|| infcx.next_ty_var(DUMMY_SP))
|
||||
} else {
|
||||
ty.super_fold_with(self)
|
||||
}
|
||||
|
@ -3443,8 +3440,6 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
self.dcx().try_steal_replace_and_emit_err(self.tcx.def_span(def_id), StashKey::Cycle, err)
|
||||
}
|
||||
|
||||
// FIXME(@lcnr): This function could be changed to trait `TraitRef` directly
|
||||
// instead of using a `Binder`.
|
||||
fn report_signature_mismatch_error(
|
||||
&self,
|
||||
obligation: &PredicateObligation<'tcx>,
|
||||
|
|
|
@ -10,7 +10,7 @@ use rustc_infer::infer::canonical::Canonical;
|
|||
use rustc_infer::infer::{RegionResolutionError, TyCtxtInferExt};
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_infer::{infer::outlives::env::OutlivesEnvironment, traits::FulfillmentError};
|
||||
use rustc_middle::ty::{self, AdtDef, GenericArg, List, Ty, TyCtxt, TypeVisitableExt};
|
||||
use rustc_middle::ty::{self, AdtDef, Ty, TyCtxt, TypeVisitableExt};
|
||||
use rustc_span::DUMMY_SP;
|
||||
|
||||
use super::outlives_bounds::InferCtxtExt;
|
||||
|
@ -129,7 +129,7 @@ pub fn all_fields_implement_trait<'tcx>(
|
|||
param_env: ty::ParamEnv<'tcx>,
|
||||
self_type: Ty<'tcx>,
|
||||
adt: AdtDef<'tcx>,
|
||||
args: &'tcx List<GenericArg<'tcx>>,
|
||||
args: ty::GenericArgsRef<'tcx>,
|
||||
parent_cause: ObligationCause<'tcx>,
|
||||
lang_item: LangItem,
|
||||
) -> Result<(), Vec<(&'tcx ty::FieldDef, Ty<'tcx>, InfringingFieldsReason<'tcx>)>> {
|
||||
|
|
|
@ -18,7 +18,6 @@ use rustc_middle::traits::ImplSource;
|
|||
use rustc_middle::traits::ImplSourceUserDefinedData;
|
||||
|
||||
use crate::errors::InherentProjectionNormalizationOverflow;
|
||||
use crate::infer::type_variable::TypeVariableOrigin;
|
||||
use crate::infer::{BoundRegionConversionTime, InferOk};
|
||||
use crate::traits::normalize::normalize_with_depth;
|
||||
use crate::traits::normalize::normalize_with_depth_to;
|
||||
|
@ -521,10 +520,7 @@ fn normalize_to_error<'a, 'tcx>(
|
|||
predicate: trait_ref.to_predicate(selcx.tcx()),
|
||||
};
|
||||
let tcx = selcx.infcx.tcx;
|
||||
let new_value = selcx.infcx.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: tcx.def_span(projection_ty.def_id),
|
||||
});
|
||||
let new_value = selcx.infcx.next_ty_var(tcx.def_span(projection_ty.def_id));
|
||||
Normalized { value: new_value, obligations: vec![trait_obligation] }
|
||||
}
|
||||
|
||||
|
|
|
@ -693,7 +693,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
|
||||
let vtable_base = vtable_trait_first_method_offset(
|
||||
tcx,
|
||||
(unnormalized_upcast_trait_ref, ty::Binder::dummy(object_trait_ref)),
|
||||
unnormalized_upcast_trait_ref,
|
||||
ty::Binder::dummy(object_trait_ref),
|
||||
);
|
||||
|
||||
Ok(ImplSource::Builtin(BuiltinImplSource::Object { vtable_base: vtable_base }, nested))
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
use rustc_infer::infer::at::At;
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::traits::{FulfillmentError, TraitEngine};
|
||||
use rustc_macros::extension;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
|
@ -20,9 +19,7 @@ impl<'tcx> At<'_, 'tcx> {
|
|||
return Ok(ty);
|
||||
};
|
||||
|
||||
let new_infer_ty = self
|
||||
.infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: self.cause.span });
|
||||
let new_infer_ty = self.infcx.next_ty_var(self.cause.span);
|
||||
|
||||
// We simply emit an `alias-eq` goal here, since that will take care of
|
||||
// normalizing the LHS of the projection until it is a rigid projection
|
||||
|
|
|
@ -320,16 +320,11 @@ fn vtable_entries<'tcx>(
|
|||
}
|
||||
|
||||
/// Find slot base for trait methods within vtable entries of another trait
|
||||
// FIXME(@lcnr): This isn't a query, so why does it take a tuple as its argument.
|
||||
pub(super) fn vtable_trait_first_method_offset<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
key: (
|
||||
ty::PolyTraitRef<'tcx>, // trait_to_be_found
|
||||
ty::PolyTraitRef<'tcx>, // trait_owning_vtable
|
||||
),
|
||||
trait_to_be_found: ty::PolyTraitRef<'tcx>,
|
||||
trait_owning_vtable: ty::PolyTraitRef<'tcx>,
|
||||
) -> usize {
|
||||
let (trait_to_be_found, trait_owning_vtable) = key;
|
||||
|
||||
// #90177
|
||||
let trait_to_be_found_erased = tcx.erase_regions(trait_to_be_found);
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ use test::{black_box, Bencher};
|
|||
|
||||
mod char_count;
|
||||
mod corpora;
|
||||
mod debug;
|
||||
mod iter;
|
||||
|
||||
#[bench]
|
||||
|
|
79
library/core/benches/str/debug.rs
Normal file
79
library/core/benches/str/debug.rs
Normal file
|
@ -0,0 +1,79 @@
|
|||
//! This primarily benchmarks `impl Debug for str`,
|
||||
//! and it also explicitly tests that we minimizes calls to the underlying `Write`r.
|
||||
//! While that is an implementation detail and there are no guarantees about it,
|
||||
//! we should still try to minimize those calls over time rather than regress them.
|
||||
|
||||
use std::fmt::{self, Write};
|
||||
use test::{black_box, Bencher};
|
||||
|
||||
#[derive(Default)]
|
||||
struct CountingWriter {
|
||||
buf: String,
|
||||
write_calls: usize,
|
||||
}
|
||||
|
||||
impl Write for CountingWriter {
|
||||
fn write_str(&mut self, s: &str) -> fmt::Result {
|
||||
self.buf.push_str(s);
|
||||
self.write_calls += 1;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn assert_fmt(s: &str, expected: &str, expected_write_calls: usize) {
|
||||
let mut w = CountingWriter::default();
|
||||
|
||||
write!(&mut w, "{s:?}").unwrap();
|
||||
assert_eq!(s.len(), 64);
|
||||
assert_eq!(w.buf, expected);
|
||||
assert_eq!(w.write_calls, expected_write_calls);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn ascii_only(b: &mut Bencher) {
|
||||
let s = "just a bit of ascii text that has no escapes. 64 bytes exactly!!";
|
||||
assert_fmt(s, r#""just a bit of ascii text that has no escapes. 64 bytes exactly!!""#, 3);
|
||||
b.iter(|| {
|
||||
black_box(format!("{:?}", black_box(s)));
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn ascii_escapes(b: &mut Bencher) {
|
||||
let s = "some\tmore\tascii\ttext\nthis time with some \"escapes\", also 64 byte";
|
||||
assert_fmt(
|
||||
s,
|
||||
r#""some\tmore\tascii\ttext\nthis time with some \"escapes\", also 64 byte""#,
|
||||
21,
|
||||
);
|
||||
b.iter(|| {
|
||||
black_box(format!("{:?}", black_box(s)));
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn some_unicode(b: &mut Bencher) {
|
||||
let s = "egy kis szöveg néhány unicode betűvel. legyen ez is 64 byte.";
|
||||
assert_fmt(s, r#""egy kis szöveg néhány unicode betűvel. legyen ez is 64 byte.""#, 3);
|
||||
b.iter(|| {
|
||||
black_box(format!("{:?}", black_box(s)));
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn mostly_unicode(b: &mut Bencher) {
|
||||
let s = "предложение из кириллических букв.";
|
||||
assert_fmt(s, r#""предложение из кириллических букв.""#, 3);
|
||||
b.iter(|| {
|
||||
black_box(format!("{:?}", black_box(s)));
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn mixed(b: &mut Bencher) {
|
||||
let s = "\"❤️\"\n\"hűha ez betű\"\n\"кириллических букв\".";
|
||||
assert_fmt(s, r#""\"❤\u{fe0f}\"\n\"hűha ez betű\"\n\"кириллических букв\".""#, 36);
|
||||
b.iter(|| {
|
||||
black_box(format!("{:?}", black_box(s)));
|
||||
});
|
||||
}
|
|
@ -2,7 +2,7 @@ use clippy_utils::diagnostics::span_lint_and_help;
|
|||
use rustc_hir::{HirId, Item, ItemKind};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::ty::layout::LayoutOf;
|
||||
use rustc_middle::ty::{self, FieldDef, GenericArg, List};
|
||||
use rustc_middle::ty::{self, FieldDef};
|
||||
use rustc_session::declare_lint_pass;
|
||||
use rustc_span::sym;
|
||||
|
||||
|
@ -85,7 +85,7 @@ fn is_union_with_two_non_zst_fields<'tcx>(cx: &LateContext<'tcx>, item: &Item<'t
|
|||
}
|
||||
}
|
||||
|
||||
fn is_zst<'tcx>(cx: &LateContext<'tcx>, field: &FieldDef, args: &'tcx List<GenericArg<'tcx>>) -> bool {
|
||||
fn is_zst<'tcx>(cx: &LateContext<'tcx>, field: &FieldDef, args: ty::GenericArgsRef<'tcx>) -> bool {
|
||||
let ty = field.ty(cx.tcx, args);
|
||||
if let Ok(layout) = cx.layout_of(ty) {
|
||||
layout.is_zst()
|
||||
|
|
|
@ -13,7 +13,7 @@ use rustc_infer::infer::TyCtxtInferExt;
|
|||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::mir::{Rvalue, StatementKind};
|
||||
use rustc_middle::ty::{
|
||||
self, ClauseKind, EarlyBinder, FnSig, GenericArg, GenericArgKind, List, ParamTy, ProjectionPredicate, Ty,
|
||||
self, ClauseKind, EarlyBinder, FnSig, GenericArg, GenericArgKind, ParamTy, ProjectionPredicate, Ty,
|
||||
};
|
||||
use rustc_session::impl_lint_pass;
|
||||
use rustc_span::symbol::sym;
|
||||
|
@ -161,7 +161,7 @@ fn needless_borrow_count<'tcx>(
|
|||
cx: &LateContext<'tcx>,
|
||||
possible_borrowers: &mut Vec<(LocalDefId, PossibleBorrowerMap<'tcx, 'tcx>)>,
|
||||
fn_id: DefId,
|
||||
callee_args: &'tcx List<GenericArg<'tcx>>,
|
||||
callee_args: ty::GenericArgsRef<'tcx>,
|
||||
arg_index: usize,
|
||||
param_ty: ParamTy,
|
||||
mut expr: &Expr<'tcx>,
|
||||
|
|
|
@ -10,7 +10,6 @@ use rustc_hir as hir;
|
|||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::{Expr, FnDecl, LangItem, TyKind, Unsafety};
|
||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_infer::infer::TyCtxtInferExt;
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::mir::interpret::Scalar;
|
||||
|
@ -19,7 +18,7 @@ use rustc_middle::traits::EvaluationResult;
|
|||
use rustc_middle::ty::layout::ValidityRequirement;
|
||||
use rustc_middle::ty::{
|
||||
self, AdtDef, AliasTy, AssocKind, Binder, BoundRegion, FnSig, GenericArg, GenericArgKind, GenericArgsRef,
|
||||
GenericParamDefKind, IntTy, List, ParamEnv, Region, RegionKind, ToPredicate, TraitRef, Ty, TyCtxt,
|
||||
GenericParamDefKind, IntTy, ParamEnv, Region, RegionKind, ToPredicate, TraitRef, Ty, TyCtxt,
|
||||
TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, UintTy, VariantDef, VariantDiscr,
|
||||
};
|
||||
use rustc_span::symbol::Ident;
|
||||
|
@ -276,11 +275,7 @@ pub fn implements_trait_with_env_from_iter<'tcx>(
|
|||
.into_iter()
|
||||
.map(|arg| {
|
||||
arg.into().unwrap_or_else(|| {
|
||||
let orig = TypeVariableOrigin {
|
||||
span: DUMMY_SP,
|
||||
param_def_id: None,
|
||||
};
|
||||
infcx.next_ty_var(orig).into()
|
||||
infcx.next_ty_var(DUMMY_SP).into()
|
||||
})
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
@ -961,7 +956,11 @@ pub struct AdtVariantInfo {
|
|||
|
||||
impl AdtVariantInfo {
|
||||
/// Returns ADT variants ordered by size
|
||||
pub fn new<'tcx>(cx: &LateContext<'tcx>, adt: AdtDef<'tcx>, subst: &'tcx List<GenericArg<'tcx>>) -> Vec<Self> {
|
||||
pub fn new<'tcx>(
|
||||
cx: &LateContext<'tcx>,
|
||||
adt: AdtDef<'tcx>,
|
||||
subst: GenericArgsRef<'tcx>
|
||||
) -> Vec<Self> {
|
||||
let mut variants_size = adt
|
||||
.variants()
|
||||
.iter()
|
||||
|
|
|
@ -16,7 +16,7 @@ camino = "1"
|
|||
reqwest = { version = "0.11", features = ["blocking"] }
|
||||
zip = { version = "0.6", default-features = false, features = ["deflate"] }
|
||||
tar = "0.4"
|
||||
xz = "0.1"
|
||||
xz = { version = "0.1", package = "xz2" }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
glob = "0.3"
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
//@ known-bug: rust-lang/rust#124702
|
||||
//@ compile-flags: -Znext-solver=coherence
|
||||
trait X {}
|
||||
|
||||
trait Z {
|
||||
type Assoc: Y;
|
||||
}
|
||||
struct A<T>(T);
|
||||
|
||||
impl<T: X> Z for A<T> {
|
||||
type Assoc = T;
|
||||
}
|
||||
|
||||
impl<T> From<<A<A<T>> as Z>::Assoc> for T {}
|
|
@ -0,0 +1,43 @@
|
|||
//@ compile-flags: -Znext-solver=coherence
|
||||
//@ check-pass
|
||||
|
||||
// A regression test for #124791. Computing ambiguity causes
|
||||
// for the overlap of the `ToString` impls caused an ICE.
|
||||
#![crate_type = "lib"]
|
||||
#![feature(min_specialization)]
|
||||
trait Display {}
|
||||
|
||||
trait ToOwned {
|
||||
type Owned;
|
||||
}
|
||||
|
||||
impl<T> ToOwned for T {
|
||||
type Owned = T;
|
||||
}
|
||||
|
||||
struct Cow<B: ?Sized>(B);
|
||||
|
||||
impl<B: ?Sized> Display for Cow<B>
|
||||
where
|
||||
B: ToOwned,
|
||||
B::Owned: Display,
|
||||
{
|
||||
}
|
||||
|
||||
impl Display for () {}
|
||||
|
||||
trait ToString {
|
||||
fn to_string();
|
||||
}
|
||||
|
||||
impl<T: Display + ?Sized> ToString for T {
|
||||
default fn to_string() {}
|
||||
}
|
||||
|
||||
impl ToString for Cow<str> {
|
||||
fn to_string() {}
|
||||
}
|
||||
|
||||
impl ToOwned for str {
|
||||
type Owned = ();
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
//@ compile-flags: -Znext-solver=coherence
|
||||
|
||||
// A regression test for #124791. Computing ambiguity causes
|
||||
// for the overlap of the `ToString` impls caused an ICE.
|
||||
#![crate_type = "lib"]
|
||||
trait ToOwned {
|
||||
type Owned;
|
||||
}
|
||||
impl<T> ToOwned for T {
|
||||
type Owned = u8;
|
||||
}
|
||||
impl ToOwned for str {
|
||||
type Owned = i8;
|
||||
}
|
||||
|
||||
trait Overlap {}
|
||||
impl<T: ToOwned<Owned = i8> + ?Sized> Overlap for T {}
|
||||
impl Overlap for str {}
|
||||
//~^ ERROR conflicting implementations of trait `Overlap`
|
|
@ -0,0 +1,11 @@
|
|||
error[E0119]: conflicting implementations of trait `Overlap` for type `str`
|
||||
--> $DIR/ambiguity-causes-canonical-state-ice-2.rs:18:1
|
||||
|
|
||||
LL | impl<T: ToOwned<Owned = i8> + ?Sized> Overlap for T {}
|
||||
| --------------------------------------------------- first implementation here
|
||||
LL | impl Overlap for str {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `str`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -61,7 +61,7 @@ where
|
|||
// entering the cycle from `A` fails, but would work if we were to use the cache
|
||||
// result of `B<X>`.
|
||||
impls_trait::<A<X>, _, _, _>();
|
||||
//~^ ERROR the trait bound `A<X>: Trait<i32, u8, u8>` is not satisfied
|
||||
//~^ ERROR the trait bound `A<X>: Trait<_, _, _>` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
error[E0277]: the trait bound `A<X>: Trait<i32, u8, u8>` is not satisfied
|
||||
error[E0277]: the trait bound `A<X>: Trait<_, _, _>` is not satisfied
|
||||
--> $DIR/incompleteness-unstable-result.rs:63:19
|
||||
|
|
||||
LL | impls_trait::<A<X>, _, _, _>();
|
||||
| ^^^^ the trait `Trait<i32, u8, u8>` is not implemented for `A<X>`, which is required by `A<X>: Trait<_, _, _>`
|
||||
| ^^^^ the trait `Trait<_, _, _>` is not implemented for `A<X>`, which is required by `A<X>: Trait<_, _, _>`
|
||||
|
|
||||
note: required for `A<X>` to implement `Trait<i32, u8, u8>`
|
||||
= help: the trait `Trait<U, V, D>` is implemented for `A<T>`
|
||||
note: required for `A<X>` to implement `Trait<_, _, _>`
|
||||
--> $DIR/incompleteness-unstable-result.rs:32:50
|
||||
|
|
||||
LL | impl<T: ?Sized, U: ?Sized, V: ?Sized, D: ?Sized> Trait<U, V, D> for A<T>
|
||||
|
@ -13,16 +14,12 @@ LL | impl<T: ?Sized, U: ?Sized, V: ?Sized, D: ?Sized> Trait<U, V, D> for A<T>
|
|||
LL | A<T>: Trait<U, D, V>,
|
||||
| -------------- unsatisfied trait bound introduced here
|
||||
= note: 8 redundant requirements hidden
|
||||
= note: required for `A<X>` to implement `Trait<i32, u8, u8>`
|
||||
= note: required for `A<X>` to implement `Trait<_, _, _>`
|
||||
note: required by a bound in `impls_trait`
|
||||
--> $DIR/incompleteness-unstable-result.rs:51:28
|
||||
|
|
||||
LL | fn impls_trait<T: ?Sized + Trait<U, V, D>, U: ?Sized, V: ?Sized, D: ?Sized>() {}
|
||||
| ^^^^^^^^^^^^^^ required by this bound in `impls_trait`
|
||||
help: consider extending the `where` clause, but there might be an alternative better way to express this requirement
|
||||
|
|
||||
LL | X: IncompleteGuidance<u32, i16>, A<X>: Trait<i32, u8, u8>
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue