Auto merge of #124388 - compiler-errors:rollup-v17b8fm, r=compiler-errors
Rollup of 4 pull requests Successful merges: - #124076 (Stablise io_error_downcast) - #124378 (Keep the LIB env var in the compiler-builtins test) - #124379 (Remove special-casing for `SimplifiedType` for next solver) - #124381 (Renamed `DerivedObligation` to `WellFormedDeriveObligation`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
e59f2c544a
@ -328,11 +328,16 @@ pub enum ObligationCauseCode<'tcx> {
|
|||||||
/// `static` items must have `Sync` type.
|
/// `static` items must have `Sync` type.
|
||||||
SharedStatic,
|
SharedStatic,
|
||||||
|
|
||||||
|
/// Derived obligation (i.e. theoretical `where` clause) on a built-in
|
||||||
|
/// implementation like `Copy` or `Sized`.
|
||||||
BuiltinDerivedObligation(DerivedObligationCause<'tcx>),
|
BuiltinDerivedObligation(DerivedObligationCause<'tcx>),
|
||||||
|
|
||||||
|
/// Derived obligation (i.e. `where` clause) on an user-provided impl
|
||||||
|
/// or a trait alias.
|
||||||
ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>>),
|
ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>>),
|
||||||
|
|
||||||
DerivedObligation(DerivedObligationCause<'tcx>),
|
/// Derived obligation for WF goals.
|
||||||
|
WellFormedDerivedObligation(DerivedObligationCause<'tcx>),
|
||||||
|
|
||||||
FunctionArgumentObligation {
|
FunctionArgumentObligation {
|
||||||
/// The node of the relevant argument in the function call.
|
/// The node of the relevant argument in the function call.
|
||||||
@ -534,7 +539,7 @@ pub fn parent(&self) -> Option<(&Self, Option<ty::PolyTraitPredicate<'tcx>>)> {
|
|||||||
match self {
|
match self {
|
||||||
FunctionArgumentObligation { parent_code, .. } => Some((parent_code, None)),
|
FunctionArgumentObligation { parent_code, .. } => Some((parent_code, None)),
|
||||||
BuiltinDerivedObligation(derived)
|
BuiltinDerivedObligation(derived)
|
||||||
| DerivedObligation(derived)
|
| WellFormedDerivedObligation(derived)
|
||||||
| ImplDerivedObligation(box ImplDerivedObligationCause { derived, .. }) => {
|
| ImplDerivedObligation(box ImplDerivedObligationCause { derived, .. }) => {
|
||||||
Some((&derived.parent_code, Some(derived.parent_trait_pred)))
|
Some((&derived.parent_code, Some(derived.parent_trait_pred)))
|
||||||
}
|
}
|
||||||
|
@ -58,30 +58,6 @@ pub enum TreatParams {
|
|||||||
/// This also treats projections with inference variables as infer vars
|
/// This also treats projections with inference variables as infer vars
|
||||||
/// since they could be further normalized.
|
/// since they could be further normalized.
|
||||||
ForLookup,
|
ForLookup,
|
||||||
/// Treat parameters as placeholders in the given environment. This is the
|
|
||||||
/// correct mode for *lookup*, as during candidate selection.
|
|
||||||
///
|
|
||||||
/// N.B. during deep rejection, this acts identically to `ForLookup`.
|
|
||||||
///
|
|
||||||
/// FIXME(-Znext-solver): Remove this variant and cleanup
|
|
||||||
/// the code.
|
|
||||||
NextSolverLookup,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// During fast-rejection, we have the choice of treating projection types
|
|
||||||
/// as either simplifiable or not, depending on whether we expect the projection
|
|
||||||
/// to be normalized/rigid.
|
|
||||||
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
||||||
pub enum TreatProjections {
|
|
||||||
/// In the old solver we don't try to normalize projections
|
|
||||||
/// when looking up impls and only access them by using the
|
|
||||||
/// current self type. This means that if the self type is
|
|
||||||
/// a projection which could later be normalized, we must not
|
|
||||||
/// treat it as rigid.
|
|
||||||
ForLookup,
|
|
||||||
/// We can treat projections in the self type as opaque as
|
|
||||||
/// we separately look up impls for the normalized self type.
|
|
||||||
NextSolverLookup,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to simplify a type by only returning the outermost injective¹ layer, if one exists.
|
/// Tries to simplify a type by only returning the outermost injective¹ layer, if one exists.
|
||||||
@ -139,21 +115,17 @@ pub fn simplify_type<'tcx>(
|
|||||||
ty::FnPtr(f) => Some(SimplifiedType::Function(f.skip_binder().inputs().len())),
|
ty::FnPtr(f) => Some(SimplifiedType::Function(f.skip_binder().inputs().len())),
|
||||||
ty::Placeholder(..) => Some(SimplifiedType::Placeholder),
|
ty::Placeholder(..) => Some(SimplifiedType::Placeholder),
|
||||||
ty::Param(_) => match treat_params {
|
ty::Param(_) => match treat_params {
|
||||||
TreatParams::ForLookup | TreatParams::NextSolverLookup => {
|
TreatParams::ForLookup => Some(SimplifiedType::Placeholder),
|
||||||
Some(SimplifiedType::Placeholder)
|
|
||||||
}
|
|
||||||
TreatParams::AsCandidateKey => None,
|
TreatParams::AsCandidateKey => None,
|
||||||
},
|
},
|
||||||
ty::Alias(..) => match treat_params {
|
ty::Alias(..) => match treat_params {
|
||||||
// When treating `ty::Param` as a placeholder, projections also
|
// When treating `ty::Param` as a placeholder, projections also
|
||||||
// don't unify with anything else as long as they are fully normalized.
|
// don't unify with anything else as long as they are fully normalized.
|
||||||
//
|
// FIXME(-Znext-solver): Can remove this `if` and always simplify to `Placeholder`
|
||||||
// We will have to be careful with lazy normalization here.
|
// when the new solver is enabled by default.
|
||||||
// FIXME(lazy_normalization): This is probably not right...
|
|
||||||
TreatParams::ForLookup if !ty.has_non_region_infer() => {
|
TreatParams::ForLookup if !ty.has_non_region_infer() => {
|
||||||
Some(SimplifiedType::Placeholder)
|
Some(SimplifiedType::Placeholder)
|
||||||
}
|
}
|
||||||
TreatParams::NextSolverLookup => Some(SimplifiedType::Placeholder),
|
|
||||||
TreatParams::ForLookup | TreatParams::AsCandidateKey => None,
|
TreatParams::ForLookup | TreatParams::AsCandidateKey => None,
|
||||||
},
|
},
|
||||||
ty::Foreign(def_id) => Some(SimplifiedType::Foreign(def_id)),
|
ty::Foreign(def_id) => Some(SimplifiedType::Foreign(def_id)),
|
||||||
@ -331,7 +303,7 @@ pub fn types_may_unify<'tcx>(self, obligation_ty: Ty<'tcx>, impl_ty: Ty<'tcx>) -
|
|||||||
// Depending on the value of `treat_obligation_params`, we either
|
// Depending on the value of `treat_obligation_params`, we either
|
||||||
// treat generic parameters like placeholders or like inference variables.
|
// treat generic parameters like placeholders or like inference variables.
|
||||||
ty::Param(_) => match self.treat_obligation_params {
|
ty::Param(_) => match self.treat_obligation_params {
|
||||||
TreatParams::ForLookup | TreatParams::NextSolverLookup => false,
|
TreatParams::ForLookup => false,
|
||||||
TreatParams::AsCandidateKey => true,
|
TreatParams::AsCandidateKey => true,
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -373,7 +345,7 @@ pub fn consts_may_unify(self, obligation_ct: ty::Const<'_>, impl_ct: ty::Const<'
|
|||||||
let k = impl_ct.kind();
|
let k = impl_ct.kind();
|
||||||
match obligation_ct.kind() {
|
match obligation_ct.kind() {
|
||||||
ty::ConstKind::Param(_) => match self.treat_obligation_params {
|
ty::ConstKind::Param(_) => match self.treat_obligation_params {
|
||||||
TreatParams::ForLookup | TreatParams::NextSolverLookup => false,
|
TreatParams::ForLookup => false,
|
||||||
TreatParams::AsCandidateKey => true,
|
TreatParams::AsCandidateKey => true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::traits::specialization_graph;
|
use crate::traits::specialization_graph;
|
||||||
use crate::ty::fast_reject::{self, SimplifiedType, TreatParams, TreatProjections};
|
use crate::ty::fast_reject::{self, SimplifiedType, TreatParams};
|
||||||
use crate::ty::{Ident, Ty, TyCtxt};
|
use crate::ty::{Ident, Ty, TyCtxt};
|
||||||
use hir::def_id::LOCAL_CRATE;
|
use hir::def_id::LOCAL_CRATE;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -135,21 +135,6 @@ pub fn for_each_relevant_impl(
|
|||||||
self,
|
self,
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
self_ty: Ty<'tcx>,
|
self_ty: Ty<'tcx>,
|
||||||
f: impl FnMut(DefId),
|
|
||||||
) {
|
|
||||||
self.for_each_relevant_impl_treating_projections(
|
|
||||||
trait_def_id,
|
|
||||||
self_ty,
|
|
||||||
TreatProjections::ForLookup,
|
|
||||||
f,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn for_each_relevant_impl_treating_projections(
|
|
||||||
self,
|
|
||||||
trait_def_id: DefId,
|
|
||||||
self_ty: Ty<'tcx>,
|
|
||||||
treat_projections: TreatProjections,
|
|
||||||
mut f: impl FnMut(DefId),
|
mut f: impl FnMut(DefId),
|
||||||
) {
|
) {
|
||||||
// FIXME: This depends on the set of all impls for the trait. That is
|
// FIXME: This depends on the set of all impls for the trait. That is
|
||||||
@ -163,17 +148,13 @@ pub fn for_each_relevant_impl_treating_projections(
|
|||||||
f(impl_def_id);
|
f(impl_def_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that we're using `TreatParams::ForLookup` to query `non_blanket_impls` while using
|
|
||||||
// `TreatParams::AsCandidateKey` while actually adding them.
|
|
||||||
let treat_params = match treat_projections {
|
|
||||||
TreatProjections::NextSolverLookup => TreatParams::NextSolverLookup,
|
|
||||||
TreatProjections::ForLookup => TreatParams::ForLookup,
|
|
||||||
};
|
|
||||||
// This way, when searching for some impl for `T: Trait`, we do not look at any impls
|
// This way, when searching for some impl for `T: Trait`, we do not look at any impls
|
||||||
// whose outer level is not a parameter or projection. Especially for things like
|
// whose outer level is not a parameter or projection. Especially for things like
|
||||||
// `T: Clone` this is incredibly useful as we would otherwise look at all the impls
|
// `T: Clone` this is incredibly useful as we would otherwise look at all the impls
|
||||||
// of `Clone` for `Option<T>`, `Vec<T>`, `ConcreteType` and so on.
|
// of `Clone` for `Option<T>`, `Vec<T>`, `ConcreteType` and so on.
|
||||||
if let Some(simp) = fast_reject::simplify_type(self, self_ty, treat_params) {
|
// Note that we're using `TreatParams::ForLookup` to query `non_blanket_impls` while using
|
||||||
|
// `TreatParams::AsCandidateKey` while actually adding them.
|
||||||
|
if let Some(simp) = fast_reject::simplify_type(self, self_ty, TreatParams::ForLookup) {
|
||||||
if let Some(impls) = impls.non_blanket_impls.get(&simp) {
|
if let Some(impls) = impls.non_blanket_impls.get(&simp) {
|
||||||
for &impl_def_id in impls {
|
for &impl_def_id in impls {
|
||||||
f(impl_def_id);
|
f(impl_def_id);
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
CandidateSource, CanonicalResponse, Certainty, Goal, QueryResult,
|
CandidateSource, CanonicalResponse, Certainty, Goal, QueryResult,
|
||||||
};
|
};
|
||||||
use rustc_middle::traits::{BuiltinImplSource, Reveal};
|
use rustc_middle::traits::{BuiltinImplSource, Reveal};
|
||||||
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams, TreatProjections};
|
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
|
||||||
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
|
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
|
||||||
use rustc_middle::ty::{TraitPredicate, TypeVisitableExt};
|
use rustc_middle::ty::{TraitPredicate, TypeVisitableExt};
|
||||||
use rustc_span::{ErrorGuaranteed, DUMMY_SP};
|
use rustc_span::{ErrorGuaranteed, DUMMY_SP};
|
||||||
@ -1045,6 +1045,12 @@ fn disqualify_auto_trait_candidate_due_to_possible_impl(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we still have an alias here, it must be rigid. For opaques, it's always
|
||||||
|
// okay to consider auto traits because that'll reveal its hidden type. For
|
||||||
|
// non-opaque aliases, we will not assemble any candidates since there's no way
|
||||||
|
// to further look into its type.
|
||||||
|
ty::Alias(..) => None,
|
||||||
|
|
||||||
// For rigid types, any possible implementation that could apply to
|
// For rigid types, any possible implementation that could apply to
|
||||||
// the type (even if after unification and processing nested goals
|
// the type (even if after unification and processing nested goals
|
||||||
// it does not hold) will disqualify the built-in auto impl.
|
// it does not hold) will disqualify the built-in auto impl.
|
||||||
@ -1072,15 +1078,11 @@ fn disqualify_auto_trait_candidate_due_to_possible_impl(
|
|||||||
| ty::CoroutineWitness(..)
|
| ty::CoroutineWitness(..)
|
||||||
| ty::Never
|
| ty::Never
|
||||||
| ty::Tuple(_)
|
| ty::Tuple(_)
|
||||||
| ty::Adt(_, _)
|
| ty::Adt(_, _) => {
|
||||||
// FIXME: Handling opaques here is kinda sus. Especially because we
|
|
||||||
// simplify them to SimplifiedType::Placeholder.
|
|
||||||
| ty::Alias(ty::Opaque, _) => {
|
|
||||||
let mut disqualifying_impl = None;
|
let mut disqualifying_impl = None;
|
||||||
self.tcx().for_each_relevant_impl_treating_projections(
|
self.tcx().for_each_relevant_impl(
|
||||||
goal.predicate.def_id(),
|
goal.predicate.def_id(),
|
||||||
goal.predicate.self_ty(),
|
goal.predicate.self_ty(),
|
||||||
TreatProjections::NextSolverLookup,
|
|
||||||
|impl_def_id| {
|
|impl_def_id| {
|
||||||
disqualifying_impl = Some(impl_def_id);
|
disqualifying_impl = Some(impl_def_id);
|
||||||
},
|
},
|
||||||
|
@ -128,7 +128,7 @@ fn on_unimplemented_note(
|
|||||||
match obligation.cause.code() {
|
match obligation.cause.code() {
|
||||||
ObligationCauseCode::BuiltinDerivedObligation(..)
|
ObligationCauseCode::BuiltinDerivedObligation(..)
|
||||||
| ObligationCauseCode::ImplDerivedObligation(..)
|
| ObligationCauseCode::ImplDerivedObligation(..)
|
||||||
| ObligationCauseCode::DerivedObligation(..) => {}
|
| ObligationCauseCode::WellFormedDerivedObligation(..) => {}
|
||||||
_ => {
|
_ => {
|
||||||
// this is a "direct", user-specified, rather than derived,
|
// this is a "direct", user-specified, rather than derived,
|
||||||
// obligation.
|
// obligation.
|
||||||
|
@ -2294,7 +2294,7 @@ fn maybe_note_obligation_cause_for_async_await<G: EmissionGuarantee>(
|
|||||||
|
|
||||||
next_code = Some(&cause.derived.parent_code);
|
next_code = Some(&cause.derived.parent_code);
|
||||||
}
|
}
|
||||||
ObligationCauseCode::DerivedObligation(derived_obligation)
|
ObligationCauseCode::WellFormedDerivedObligation(derived_obligation)
|
||||||
| ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) => {
|
| ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) => {
|
||||||
let ty = derived_obligation.parent_trait_pred.skip_binder().self_ty();
|
let ty = derived_obligation.parent_trait_pred.skip_binder().self_ty();
|
||||||
debug!(
|
debug!(
|
||||||
@ -3423,7 +3423,7 @@ fn note_obligation_cause_code<G: EmissionGuarantee, T>(
|
|||||||
)
|
)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
ObligationCauseCode::DerivedObligation(ref data) => {
|
ObligationCauseCode::WellFormedDerivedObligation(ref data) => {
|
||||||
let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred);
|
let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred);
|
||||||
let parent_predicate = parent_trait_ref;
|
let parent_predicate = parent_trait_ref;
|
||||||
// #74711: avoid a stack overflow
|
// #74711: avoid a stack overflow
|
||||||
|
@ -381,7 +381,7 @@ fn compute_trait_pred(&mut self, trait_pred: ty::TraitPredicate<'tcx>, elaborate
|
|||||||
if let Some(parent_trait_pred) = predicate.to_opt_poly_trait_pred() {
|
if let Some(parent_trait_pred) = predicate.to_opt_poly_trait_pred() {
|
||||||
cause = cause.derived_cause(
|
cause = cause.derived_cause(
|
||||||
parent_trait_pred,
|
parent_trait_pred,
|
||||||
traits::ObligationCauseCode::DerivedObligation,
|
traits::ObligationCauseCode::WellFormedDerivedObligation,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
extend_cause_with_original_assoc_item_obligation(tcx, item, &mut cause, predicate);
|
extend_cause_with_original_assoc_item_obligation(tcx, item, &mut cause, predicate);
|
||||||
|
@ -869,8 +869,6 @@ pub fn into_inner(self) -> Option<Box<dyn error::Error + Send + Sync>> {
|
|||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// #![feature(io_error_downcast)]
|
|
||||||
///
|
|
||||||
/// use std::fmt;
|
/// use std::fmt;
|
||||||
/// use std::io;
|
/// use std::io;
|
||||||
/// use std::error::Error;
|
/// use std::error::Error;
|
||||||
@ -923,7 +921,7 @@ pub fn into_inner(self) -> Option<Box<dyn error::Error + Send + Sync>> {
|
|||||||
/// assert!(io_error.raw_os_error().is_none());
|
/// assert!(io_error.raw_os_error().is_none());
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
#[unstable(feature = "io_error_downcast", issue = "99262")]
|
#[stable(feature = "io_error_downcast", since = "CURRENT_RUSTC_VERSION")]
|
||||||
pub fn downcast<E>(self) -> result::Result<E, Self>
|
pub fn downcast<E>(self) -> result::Result<E, Self>
|
||||||
where
|
where
|
||||||
E: error::Error + Send + Sync + 'static,
|
E: error::Error + Send + Sync + 'static,
|
||||||
|
@ -63,7 +63,10 @@ fn main() {
|
|||||||
.env("RUSTC", rustc)
|
.env("RUSTC", rustc)
|
||||||
.env("RUSTFLAGS", "-Copt-level=0 -Cdebug-assertions=yes")
|
.env("RUSTFLAGS", "-Copt-level=0 -Cdebug-assertions=yes")
|
||||||
.env("CARGO_TARGET_DIR", &target_dir)
|
.env("CARGO_TARGET_DIR", &target_dir)
|
||||||
.env("RUSTC_BOOTSTRAP", "1");
|
.env("RUSTC_BOOTSTRAP", "1")
|
||||||
|
// Visual Studio 2022 requires that the LIB env var be set so it can
|
||||||
|
// find the Windows SDK.
|
||||||
|
.env("LIB", std::env::var("LIB").unwrap_or_default());
|
||||||
set_host_rpath(&mut cmd);
|
set_host_rpath(&mut cmd);
|
||||||
|
|
||||||
let status = cmd.status().unwrap();
|
let status = cmd.status().unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user