Rollup merge of #126649 - compiler-errors:nightly, r=lcnr
Fix `feature = "nightly"` in the new trait solver r? lcnr
This commit is contained in:
commit
8ddc8921ff
@ -4905,6 +4905,7 @@ version = "0.0.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.5.0",
|
"bitflags 2.5.0",
|
||||||
"derivative",
|
"derivative",
|
||||||
|
"indexmap",
|
||||||
"rustc_ast_ir",
|
"rustc_ast_ir",
|
||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
"rustc_index",
|
"rustc_index",
|
||||||
|
@ -7,7 +7,7 @@ edition = "2021"
|
|||||||
# tidy-alphabetical-start
|
# tidy-alphabetical-start
|
||||||
bitflags = "2.4.1"
|
bitflags = "2.4.1"
|
||||||
derivative = "2.2.0"
|
derivative = "2.2.0"
|
||||||
rustc_ast_ir = { path = "../rustc_ast_ir" }
|
rustc_ast_ir = { path = "../rustc_ast_ir", default-features = false }
|
||||||
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
||||||
rustc_index = { path = "../rustc_index", default-features = false }
|
rustc_index = { path = "../rustc_index", default-features = false }
|
||||||
rustc_macros = { path = "../rustc_macros", optional = true }
|
rustc_macros = { path = "../rustc_macros", optional = true }
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
//! but were uplifted in the process of making the new trait solver generic.
|
//! but were uplifted in the process of making the new trait solver generic.
|
||||||
//! So if you got to this crate from the old solver, it's totally normal.
|
//! So if you got to this crate from the old solver, it's totally normal.
|
||||||
|
|
||||||
#![feature(let_chains)]
|
|
||||||
|
|
||||||
pub mod canonicalizer;
|
pub mod canonicalizer;
|
||||||
pub mod infcx;
|
pub mod infcx;
|
||||||
pub mod resolve;
|
pub mod resolve;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
//! traits, `Copy`/`Clone`.
|
//! traits, `Copy`/`Clone`.
|
||||||
|
|
||||||
use rustc_ast_ir::{Movability, Mutability};
|
use rustc_ast_ir::{Movability, Mutability};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_type_ir::data_structures::HashMap;
|
||||||
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||||
use rustc_type_ir::inherent::*;
|
use rustc_type_ir::inherent::*;
|
||||||
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
||||||
@ -304,9 +304,10 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_callable<I: Intern
|
|||||||
let kind_ty = args.kind_ty();
|
let kind_ty = args.kind_ty();
|
||||||
let sig = args.coroutine_closure_sig().skip_binder();
|
let sig = args.coroutine_closure_sig().skip_binder();
|
||||||
|
|
||||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
// FIXME: let_chains
|
||||||
&& !args.tupled_upvars_ty().is_ty_var()
|
let kind = kind_ty.to_opt_closure_kind();
|
||||||
{
|
let coroutine_ty = if kind.is_some() && !args.tupled_upvars_ty().is_ty_var() {
|
||||||
|
let closure_kind = kind.unwrap();
|
||||||
if !closure_kind.extends(goal_kind) {
|
if !closure_kind.extends(goal_kind) {
|
||||||
return Err(NoSolution);
|
return Err(NoSolution);
|
||||||
}
|
}
|
||||||
@ -411,10 +412,11 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
|
|||||||
let kind_ty = args.kind_ty();
|
let kind_ty = args.kind_ty();
|
||||||
let sig = args.coroutine_closure_sig().skip_binder();
|
let sig = args.coroutine_closure_sig().skip_binder();
|
||||||
let mut nested = vec![];
|
let mut nested = vec![];
|
||||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
|
||||||
&& !args.tupled_upvars_ty().is_ty_var()
|
// FIXME: let_chains
|
||||||
{
|
let kind = kind_ty.to_opt_closure_kind();
|
||||||
if !closure_kind.extends(goal_kind) {
|
let coroutine_ty = if kind.is_some() && !args.tupled_upvars_ty().is_ty_var() {
|
||||||
|
if !kind.unwrap().extends(goal_kind) {
|
||||||
return Err(NoSolution);
|
return Err(NoSolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -683,7 +685,7 @@ pub(in crate::solve) fn predicates_for_object_candidate<Infcx, I>(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut replace_projection_with = FxHashMap::default();
|
let mut replace_projection_with = HashMap::default();
|
||||||
for bound in object_bounds {
|
for bound in object_bounds {
|
||||||
if let ty::ExistentialPredicate::Projection(proj) = bound.skip_binder() {
|
if let ty::ExistentialPredicate::Projection(proj) = bound.skip_binder() {
|
||||||
let proj = proj.with_self_ty(tcx, trait_ref.self_ty());
|
let proj = proj.with_self_ty(tcx, trait_ref.self_ty());
|
||||||
@ -713,7 +715,7 @@ pub(in crate::solve) fn predicates_for_object_candidate<Infcx, I>(
|
|||||||
struct ReplaceProjectionWith<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> {
|
struct ReplaceProjectionWith<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> {
|
||||||
ecx: &'a EvalCtxt<'a, Infcx>,
|
ecx: &'a EvalCtxt<'a, Infcx>,
|
||||||
param_env: I::ParamEnv,
|
param_env: I::ParamEnv,
|
||||||
mapping: FxHashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>,
|
mapping: HashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>,
|
||||||
nested: Vec<Goal<I, I::Predicate>>,
|
nested: Vec<Goal<I, I::Predicate>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -725,9 +727,8 @@ fn interner(&self) -> I {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
|
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
|
||||||
if let ty::Alias(ty::Projection, alias_ty) = ty.kind()
|
if let ty::Alias(ty::Projection, alias_ty) = ty.kind() {
|
||||||
&& let Some(replacement) = self.mapping.get(&alias_ty.def_id)
|
if let Some(replacement) = self.mapping.get(&alias_ty.def_id) {
|
||||||
{
|
|
||||||
// We may have a case where our object type's projection bound is higher-ranked,
|
// We may have a case where our object type's projection bound is higher-ranked,
|
||||||
// but the where clauses we instantiated are not. We can solve this by instantiating
|
// but the where clauses we instantiated are not. We can solve this by instantiating
|
||||||
// the binder at the usage site.
|
// the binder at the usage site.
|
||||||
@ -740,11 +741,16 @@ fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
|
|||||||
alias_ty,
|
alias_ty,
|
||||||
proj.projection_term.expect_ty(self.ecx.interner()),
|
proj.projection_term.expect_ty(self.ecx.interner()),
|
||||||
)
|
)
|
||||||
.expect("expected to be able to unify goal projection with dyn's projection"),
|
.expect(
|
||||||
|
"expected to be able to unify goal projection with dyn's projection",
|
||||||
|
),
|
||||||
);
|
);
|
||||||
proj.term.expect_ty()
|
proj.term.expect_ty()
|
||||||
} else {
|
} else {
|
||||||
ty.super_fold_with(self)
|
ty.super_fold_with(self)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
ty.super_fold_with(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||||
|
use rustc_type_ir::data_structures::ensure_sufficient_stack;
|
||||||
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||||
use rustc_type_ir::inherent::*;
|
use rustc_type_ir::inherent::*;
|
||||||
use rustc_type_ir::relate::Relate;
|
use rustc_type_ir::relate::Relate;
|
||||||
@ -88,7 +89,7 @@ pub struct EvalCtxt<'a, Infcx, I = <Infcx as SolverDelegate>::Interner>
|
|||||||
#[derive(derivative::Derivative)]
|
#[derive(derivative::Derivative)]
|
||||||
#[derivative(Clone(bound = ""), Debug(bound = ""), Default(bound = ""))]
|
#[derivative(Clone(bound = ""), Debug(bound = ""), Default(bound = ""))]
|
||||||
#[derive(TypeVisitable_Generic, TypeFoldable_Generic, Lift_Generic)]
|
#[derive(TypeVisitable_Generic, TypeFoldable_Generic, Lift_Generic)]
|
||||||
#[derive(TyDecodable, TyEncodable, HashStable_NoContext)]
|
#[cfg_attr(feature = "nightly", derive(TyDecodable, TyEncodable, HashStable_NoContext))]
|
||||||
// FIXME: This can be made crate-private once `EvalCtxt` also lives in this crate.
|
// FIXME: This can be made crate-private once `EvalCtxt` also lives in this crate.
|
||||||
pub struct NestedGoals<I: Interner> {
|
pub struct NestedGoals<I: Interner> {
|
||||||
/// These normalizes-to goals are treated specially during the evaluation
|
/// These normalizes-to goals are treated specially during the evaluation
|
||||||
@ -116,7 +117,8 @@ pub fn is_empty(&self) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Debug, Hash, HashStable_NoContext, Clone, Copy)]
|
#[derive(PartialEq, Eq, Debug, Hash, Clone, Copy)]
|
||||||
|
#[cfg_attr(feature = "nightly", derive(HashStable_NoContext))]
|
||||||
pub enum GenerateProofTree {
|
pub enum GenerateProofTree {
|
||||||
Yes,
|
Yes,
|
||||||
No,
|
No,
|
||||||
@ -689,15 +691,16 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeVisitor<I>
|
|||||||
fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
|
fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
|
||||||
match t.kind() {
|
match t.kind() {
|
||||||
ty::Infer(ty::TyVar(vid)) => {
|
ty::Infer(ty::TyVar(vid)) => {
|
||||||
if let ty::TermKind::Ty(term) = self.term.kind()
|
if let ty::TermKind::Ty(term) = self.term.kind() {
|
||||||
&& let ty::Infer(ty::TyVar(term_vid)) = term.kind()
|
if let ty::Infer(ty::TyVar(term_vid)) = term.kind() {
|
||||||
&& self.infcx.root_ty_var(vid) == self.infcx.root_ty_var(term_vid)
|
if self.infcx.root_ty_var(vid) == self.infcx.root_ty_var(term_vid) {
|
||||||
{
|
return ControlFlow::Break(());
|
||||||
ControlFlow::Break(())
|
|
||||||
} else {
|
|
||||||
self.check_nameable(self.infcx.universe_of_ty(vid).unwrap())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.check_nameable(self.infcx.universe_of_ty(vid).unwrap())
|
||||||
|
}
|
||||||
ty::Placeholder(p) => self.check_nameable(p.universe()),
|
ty::Placeholder(p) => self.check_nameable(p.universe()),
|
||||||
_ => {
|
_ => {
|
||||||
if t.has_non_region_infer() || t.has_placeholders() {
|
if t.has_non_region_infer() || t.has_placeholders() {
|
||||||
@ -712,15 +715,19 @@ fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
|
|||||||
fn visit_const(&mut self, c: I::Const) -> Self::Result {
|
fn visit_const(&mut self, c: I::Const) -> Self::Result {
|
||||||
match c.kind() {
|
match c.kind() {
|
||||||
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
|
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
|
||||||
if let ty::TermKind::Const(term) = self.term.kind()
|
if let ty::TermKind::Const(term) = self.term.kind() {
|
||||||
&& let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind()
|
if let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind()
|
||||||
&& self.infcx.root_const_var(vid) == self.infcx.root_const_var(term_vid)
|
|
||||||
{
|
{
|
||||||
ControlFlow::Break(())
|
if self.infcx.root_const_var(vid)
|
||||||
} else {
|
== self.infcx.root_const_var(term_vid)
|
||||||
self.check_nameable(self.infcx.universe_of_ct(vid).unwrap())
|
{
|
||||||
|
return ControlFlow::Break(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.check_nameable(self.infcx.universe_of_ct(vid).unwrap())
|
||||||
|
}
|
||||||
ty::ConstKind::Placeholder(p) => self.check_nameable(p.universe()),
|
ty::ConstKind::Placeholder(p) => self.check_nameable(p.universe()),
|
||||||
_ => {
|
_ => {
|
||||||
if c.has_non_region_infer() || c.has_placeholders() {
|
if c.has_non_region_infer() || c.has_placeholders() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
|
||||||
use rustc_index::{Idx, IndexVec};
|
use rustc_index::{Idx, IndexVec};
|
||||||
|
use rustc_type_ir::data_structures::{HashMap, HashSet};
|
||||||
use rustc_type_ir::inherent::*;
|
use rustc_type_ir::inherent::*;
|
||||||
use rustc_type_ir::Interner;
|
use rustc_type_ir::Interner;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
rustc_index::newtype_index! {
|
rustc_index::newtype_index! {
|
||||||
#[orderable]
|
#[orderable]
|
||||||
|
#[gate_rustc_only]
|
||||||
pub struct StackDepth {}
|
pub struct StackDepth {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +71,7 @@ struct StackEntry<I: Interner> {
|
|||||||
/// C :- D
|
/// C :- D
|
||||||
/// D :- C
|
/// D :- C
|
||||||
/// ```
|
/// ```
|
||||||
cycle_participants: FxHashSet<CanonicalInput<I>>,
|
cycle_participants: HashSet<CanonicalInput<I>>,
|
||||||
/// Starts out as `None` and gets set when rerunning this
|
/// Starts out as `None` and gets set when rerunning this
|
||||||
/// goal in case we encounter a cycle.
|
/// goal in case we encounter a cycle.
|
||||||
provisional_result: Option<QueryResult<I>>,
|
provisional_result: Option<QueryResult<I>>,
|
||||||
@ -126,7 +127,7 @@ pub(super) struct SearchGraph<I: Interner> {
|
|||||||
///
|
///
|
||||||
/// An element is *deeper* in the stack if its index is *lower*.
|
/// An element is *deeper* in the stack if its index is *lower*.
|
||||||
stack: IndexVec<StackDepth, StackEntry<I>>,
|
stack: IndexVec<StackDepth, StackEntry<I>>,
|
||||||
provisional_cache: FxHashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
provisional_cache: HashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I: Interner> SearchGraph<I> {
|
impl<I: Interner> SearchGraph<I> {
|
||||||
@ -227,13 +228,17 @@ fn tag_cycle_participants(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn clear_dependent_provisional_results(
|
fn clear_dependent_provisional_results(
|
||||||
provisional_cache: &mut FxHashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
provisional_cache: &mut HashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||||
head: StackDepth,
|
head: StackDepth,
|
||||||
) {
|
) {
|
||||||
#[allow(rustc::potential_query_instability)]
|
#[allow(rustc::potential_query_instability)]
|
||||||
provisional_cache.retain(|_, entry| {
|
provisional_cache.retain(|_, entry| {
|
||||||
entry.with_coinductive_stack.take_if(|p| p.head == head);
|
if entry.with_coinductive_stack.as_ref().is_some_and(|p| p.head == head) {
|
||||||
entry.with_inductive_stack.take_if(|p| p.head == head);
|
entry.with_coinductive_stack.take();
|
||||||
|
}
|
||||||
|
if entry.with_inductive_stack.as_ref().is_some_and(|p| p.head == head) {
|
||||||
|
entry.with_inductive_stack.take();
|
||||||
|
}
|
||||||
!entry.is_empty()
|
!entry.is_empty()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
|
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
|
||||||
|
|
||||||
use rustc_ast_ir::Movability;
|
use rustc_ast_ir::Movability;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_type_ir::data_structures::IndexSet;
|
||||||
use rustc_type_ir::inherent::*;
|
use rustc_type_ir::inherent::*;
|
||||||
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
||||||
use rustc_type_ir::visit::TypeVisitableExt as _;
|
use rustc_type_ir::visit::TypeVisitableExt as _;
|
||||||
@ -821,7 +821,7 @@ fn consider_builtin_upcast_to_principal(
|
|||||||
// We may upcast to auto traits that are either explicitly listed in
|
// We may upcast to auto traits that are either explicitly listed in
|
||||||
// the object type's bounds, or implied by the principal trait ref's
|
// the object type's bounds, or implied by the principal trait ref's
|
||||||
// supertraits.
|
// supertraits.
|
||||||
let a_auto_traits: FxIndexSet<I::DefId> = a_data
|
let a_auto_traits: IndexSet<I::DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
||||||
|
@ -7,7 +7,8 @@ edition = "2021"
|
|||||||
# tidy-alphabetical-start
|
# tidy-alphabetical-start
|
||||||
bitflags = "2.4.1"
|
bitflags = "2.4.1"
|
||||||
derivative = "2.2.0"
|
derivative = "2.2.0"
|
||||||
rustc_ast_ir = { path = "../rustc_ast_ir" }
|
indexmap = "2.0.0"
|
||||||
|
rustc_ast_ir = { path = "../rustc_ast_ir", default-features = false }
|
||||||
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
||||||
rustc_index = { path = "../rustc_index", default-features = false }
|
rustc_index = { path = "../rustc_index", default-features = false }
|
||||||
rustc_macros = { path = "../rustc_macros", optional = true }
|
rustc_macros = { path = "../rustc_macros", optional = true }
|
||||||
|
@ -5,14 +5,16 @@
|
|||||||
|
|
||||||
#[cfg(feature = "nightly")]
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||||
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_serialize::Decodable;
|
use rustc_serialize::Decodable;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
use crate::data_structures::SsoHashSet;
|
||||||
use crate::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable};
|
use crate::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||||
use crate::inherent::*;
|
use crate::inherent::*;
|
||||||
use crate::lift::Lift;
|
use crate::lift::Lift;
|
||||||
use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
|
use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
|
||||||
use crate::{self as ty, Interner, SsoHashSet};
|
use crate::{self as ty, Interner};
|
||||||
|
|
||||||
/// Binder is a binder for higher-ranked lifetimes or types. It is part of the
|
/// Binder is a binder for higher-ranked lifetimes or types. It is part of the
|
||||||
/// compiler's representation for things like `for<'a> Fn(&'a isize)`
|
/// compiler's representation for things like `for<'a> Fn(&'a isize)`
|
||||||
@ -55,6 +57,7 @@ fn lift_to_tcx(self, tcx: U) -> Option<Self::Lifted> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "nightly")]
|
||||||
macro_rules! impl_binder_encode_decode {
|
macro_rules! impl_binder_encode_decode {
|
||||||
($($t:ty),+ $(,)?) => {
|
($($t:ty),+ $(,)?) => {
|
||||||
$(
|
$(
|
||||||
@ -82,6 +85,7 @@ fn decode(decoder: &mut D) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "nightly")]
|
||||||
impl_binder_encode_decode! {
|
impl_binder_encode_decode! {
|
||||||
ty::FnSig<I>,
|
ty::FnSig<I>,
|
||||||
ty::TraitPredicate<I>,
|
ty::TraitPredicate<I>,
|
||||||
|
29
compiler/rustc_type_ir/src/data_structures.rs
Normal file
29
compiler/rustc_type_ir/src/data_structures.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#[cfg(feature = "nightly")]
|
||||||
|
mod impl_ {
|
||||||
|
pub use rustc_data_structures::fx::FxHashMap as HashMap;
|
||||||
|
pub use rustc_data_structures::fx::FxHashSet as HashSet;
|
||||||
|
pub use rustc_data_structures::fx::FxIndexMap as IndexMap;
|
||||||
|
pub use rustc_data_structures::fx::FxIndexSet as IndexSet;
|
||||||
|
pub use rustc_data_structures::sso::SsoHashMap;
|
||||||
|
pub use rustc_data_structures::sso::SsoHashSet;
|
||||||
|
pub use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
|
pub use rustc_data_structures::sync::Lrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "nightly"))]
|
||||||
|
mod impl_ {
|
||||||
|
pub use indexmap::IndexMap;
|
||||||
|
pub use indexmap::IndexSet;
|
||||||
|
pub use std::collections::HashMap;
|
||||||
|
pub use std::collections::HashMap as SsoHashMap;
|
||||||
|
pub use std::collections::HashSet;
|
||||||
|
pub use std::collections::HashSet as SsoHashSet;
|
||||||
|
pub use std::sync::Arc as Lrc;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn ensure_sufficient_stack<R>(f: impl FnOnce() -> R) -> R {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub use impl_::*;
|
@ -30,7 +30,7 @@ pub fn new(a_is_expected: bool, a: T, b: T) -> Self {
|
|||||||
Debug(bound = "")
|
Debug(bound = "")
|
||||||
)]
|
)]
|
||||||
#[derive(TypeVisitable_Generic)]
|
#[derive(TypeVisitable_Generic)]
|
||||||
#[rustc_pass_by_value]
|
#[cfg_attr(feature = "nightly", rustc_pass_by_value)]
|
||||||
pub enum TypeError<I: Interner> {
|
pub enum TypeError<I: Interner> {
|
||||||
Mismatch,
|
Mismatch,
|
||||||
ConstnessMismatch(ExpectedFound<ty::BoundConstness>),
|
ConstnessMismatch(ExpectedFound<ty::BoundConstness>),
|
||||||
|
@ -49,9 +49,10 @@
|
|||||||
use std::mem;
|
use std::mem;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
use crate::data_structures::Lrc;
|
||||||
use crate::inherent::*;
|
use crate::inherent::*;
|
||||||
use crate::visit::{TypeVisitable, TypeVisitableExt as _};
|
use crate::visit::{TypeVisitable, TypeVisitableExt as _};
|
||||||
use crate::{self as ty, Interner, Lrc};
|
use crate::{self as ty, Interner};
|
||||||
|
|
||||||
#[cfg(feature = "nightly")]
|
#[cfg(feature = "nightly")]
|
||||||
type Never = !;
|
type Never = !;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||||
|
|
||||||
use crate::Interner;
|
use crate::Interner;
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
use rustc_ast_ir::Mutability;
|
use rustc_ast_ir::Mutability;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
|
||||||
|
|
||||||
|
use crate::data_structures::HashSet;
|
||||||
use crate::fold::{TypeFoldable, TypeSuperFoldable};
|
use crate::fold::{TypeFoldable, TypeSuperFoldable};
|
||||||
use crate::relate::Relate;
|
use crate::relate::Relate;
|
||||||
use crate::solve::{CacheData, CanonicalInput, QueryResult, Reveal};
|
use crate::solve::{CacheData, CanonicalInput, QueryResult, Reveal};
|
||||||
@ -530,7 +530,7 @@ fn insert(
|
|||||||
proof_tree: Option<I::CanonicalGoalEvaluationStepRef>,
|
proof_tree: Option<I::CanonicalGoalEvaluationStepRef>,
|
||||||
additional_depth: usize,
|
additional_depth: usize,
|
||||||
encountered_overflow: bool,
|
encountered_overflow: bool,
|
||||||
cycle_participants: FxHashSet<CanonicalInput<I>>,
|
cycle_participants: HashSet<CanonicalInput<I>>,
|
||||||
dep_node: I::DepNodeIndex,
|
dep_node: I::DepNodeIndex,
|
||||||
result: QueryResult<I>,
|
result: QueryResult<I>,
|
||||||
);
|
);
|
||||||
|
@ -7,27 +7,19 @@
|
|||||||
#![cfg_attr(feature = "nightly", allow(internal_features))]
|
#![cfg_attr(feature = "nightly", allow(internal_features))]
|
||||||
// tidy-alphabetical-end
|
// tidy-alphabetical-end
|
||||||
|
|
||||||
#[cfg(feature = "nightly")]
|
|
||||||
extern crate self as rustc_type_ir;
|
extern crate self as rustc_type_ir;
|
||||||
|
|
||||||
#[cfg(feature = "nightly")]
|
|
||||||
use rustc_data_structures::sso::SsoHashSet;
|
|
||||||
#[cfg(feature = "nightly")]
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
|
||||||
#[cfg(feature = "nightly")]
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_macros::{Decodable, Encodable, HashStable_NoContext};
|
use rustc_macros::{Decodable, Encodable, HashStable_NoContext};
|
||||||
#[cfg(not(feature = "nightly"))]
|
|
||||||
use std::collections::HashSet as SsoHashSet;
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
#[cfg(not(feature = "nightly"))]
|
|
||||||
use std::sync::Arc as Lrc;
|
|
||||||
|
|
||||||
// These modules are `pub` since they are not glob-imported.
|
// These modules are `pub` since they are not glob-imported.
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod visit;
|
pub mod visit;
|
||||||
#[cfg(feature = "nightly")]
|
#[cfg(feature = "nightly")]
|
||||||
pub mod codec;
|
pub mod codec;
|
||||||
|
pub mod data_structures;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod fold;
|
pub mod fold;
|
||||||
pub mod inherent;
|
pub mod inherent;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#[cfg(feature = "nightly")]
|
||||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||||
use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic};
|
use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic};
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
use rustc_ast_ir::Mutability;
|
use rustc_ast_ir::Mutability;
|
||||||
use rustc_type_ir::error::{ExpectedFound, TypeError};
|
|
||||||
use rustc_type_ir::fold::TypeFoldable;
|
|
||||||
use rustc_type_ir::inherent::*;
|
|
||||||
use rustc_type_ir::{self as ty, Interner};
|
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
|
use crate::error::{ExpectedFound, TypeError};
|
||||||
|
use crate::fold::TypeFoldable;
|
||||||
|
use crate::inherent::*;
|
||||||
|
use crate::{self as ty, Interner};
|
||||||
|
|
||||||
pub type RelateResult<I, T> = Result<T, TypeError<I>>;
|
pub type RelateResult<I, T> = Result<T, TypeError<I>>;
|
||||||
|
|
||||||
/// Extra information about why we ended up with a particular variance.
|
/// Extra information about why we ended up with a particular variance.
|
||||||
|
@ -47,8 +47,9 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
|
use crate::data_structures::Lrc;
|
||||||
use crate::inherent::*;
|
use crate::inherent::*;
|
||||||
use crate::{self as ty, Interner, Lrc, TypeFlags};
|
use crate::{self as ty, Interner, TypeFlags};
|
||||||
|
|
||||||
/// This trait is implemented for every type that can be visited,
|
/// This trait is implemented for every type that can be visited,
|
||||||
/// providing the skeleton of the traversal.
|
/// providing the skeleton of the traversal.
|
||||||
|
Loading…
Reference in New Issue
Block a user