pass sub_relations into canonical queries
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
//! [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html
|
//! [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
use rustc_data_structures::sso::SsoHashMap;
|
||||||
use rustc_index::Idx;
|
use rustc_index::Idx;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
@@ -293,6 +294,7 @@ struct Canonicalizer<'cx, 'tcx> {
|
|||||||
// Note that indices is only used once `var_values` is big enough to be
|
// Note that indices is only used once `var_values` is big enough to be
|
||||||
// heap-allocated.
|
// heap-allocated.
|
||||||
indices: FxHashMap<GenericArg<'tcx>, BoundVar>,
|
indices: FxHashMap<GenericArg<'tcx>, BoundVar>,
|
||||||
|
sub_root_lookup_table: SsoHashMap<ty::TyVid, usize>,
|
||||||
canonicalize_mode: &'cx dyn CanonicalizeMode,
|
canonicalize_mode: &'cx dyn CanonicalizeMode,
|
||||||
needs_canonical_flags: TypeFlags,
|
needs_canonical_flags: TypeFlags,
|
||||||
|
|
||||||
@@ -361,7 +363,8 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
|
|||||||
// FIXME: perf problem described in #55921.
|
// FIXME: perf problem described in #55921.
|
||||||
ui = ty::UniverseIndex::ROOT;
|
ui = ty::UniverseIndex::ROOT;
|
||||||
}
|
}
|
||||||
self.canonicalize_ty_var(CanonicalVarKind::Ty(ui), t)
|
let sub_root = self.get_or_insert_sub_root(vid);
|
||||||
|
self.canonicalize_ty_var(CanonicalVarKind::Ty { ui, sub_root }, t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -559,6 +562,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
|
|||||||
variables: SmallVec::from_slice(base.variables),
|
variables: SmallVec::from_slice(base.variables),
|
||||||
query_state,
|
query_state,
|
||||||
indices: FxHashMap::default(),
|
indices: FxHashMap::default(),
|
||||||
|
sub_root_lookup_table: Default::default(),
|
||||||
binder_index: ty::INNERMOST,
|
binder_index: ty::INNERMOST,
|
||||||
};
|
};
|
||||||
if canonicalizer.query_state.var_values.spilled() {
|
if canonicalizer.query_state.var_values.spilled() {
|
||||||
@@ -657,6 +661,13 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_or_insert_sub_root(&mut self, vid: ty::TyVid) -> ty::BoundVar {
|
||||||
|
let root_vid = self.infcx.unwrap().sub_root_var(vid);
|
||||||
|
let idx =
|
||||||
|
*self.sub_root_lookup_table.entry(root_vid).or_insert_with(|| self.variables.len());
|
||||||
|
ty::BoundVar::from(idx)
|
||||||
|
}
|
||||||
|
|
||||||
/// Replaces the universe indexes used in `var_values` with their index in
|
/// Replaces the universe indexes used in `var_values` with their index in
|
||||||
/// `query_state.universe_map`. This minimizes the maximum universe used in
|
/// `query_state.universe_map`. This minimizes the maximum universe used in
|
||||||
/// the canonicalized value.
|
/// the canonicalized value.
|
||||||
@@ -679,7 +690,9 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
|
|||||||
CanonicalVarKind::Int | CanonicalVarKind::Float => {
|
CanonicalVarKind::Int | CanonicalVarKind::Float => {
|
||||||
return kind;
|
return kind;
|
||||||
}
|
}
|
||||||
CanonicalVarKind::Ty(u) => CanonicalVarKind::Ty(reverse_universe_map[&u]),
|
CanonicalVarKind::Ty { ui, sub_root } => {
|
||||||
|
CanonicalVarKind::Ty { ui: reverse_universe_map[&ui], sub_root }
|
||||||
|
}
|
||||||
CanonicalVarKind::Region(u) => CanonicalVarKind::Region(reverse_universe_map[&u]),
|
CanonicalVarKind::Region(u) => CanonicalVarKind::Region(reverse_universe_map[&u]),
|
||||||
CanonicalVarKind::Const(u) => CanonicalVarKind::Const(reverse_universe_map[&u]),
|
CanonicalVarKind::Const(u) => CanonicalVarKind::Const(reverse_universe_map[&u]),
|
||||||
CanonicalVarKind::PlaceholderTy(placeholder) => {
|
CanonicalVarKind::PlaceholderTy(placeholder) => {
|
||||||
|
|||||||
@@ -84,13 +84,12 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
variables: &List<CanonicalVarKind<'tcx>>,
|
variables: &List<CanonicalVarKind<'tcx>>,
|
||||||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||||
) -> CanonicalVarValues<'tcx> {
|
) -> CanonicalVarValues<'tcx> {
|
||||||
CanonicalVarValues {
|
let mut var_values = Vec::with_capacity(variables.len());
|
||||||
var_values: self.tcx.mk_args_from_iter(
|
for info in variables.iter() {
|
||||||
variables
|
let value = self.instantiate_canonical_var(span, info, &var_values, &universe_map);
|
||||||
.iter()
|
var_values.push(value);
|
||||||
.map(|kind| self.instantiate_canonical_var(span, kind, &universe_map)),
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
|
CanonicalVarValues { var_values: self.tcx.mk_args(&var_values) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given the "info" about a canonical variable, creates a fresh
|
/// Given the "info" about a canonical variable, creates a fresh
|
||||||
@@ -105,10 +104,22 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
kind: CanonicalVarKind<'tcx>,
|
kind: CanonicalVarKind<'tcx>,
|
||||||
|
previous_var_values: &[GenericArg<'tcx>],
|
||||||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||||
) -> GenericArg<'tcx> {
|
) -> GenericArg<'tcx> {
|
||||||
match kind {
|
match kind {
|
||||||
CanonicalVarKind::Ty(ui) => self.next_ty_var_in_universe(span, universe_map(ui)).into(),
|
CanonicalVarKind::Ty { ui, sub_root } => {
|
||||||
|
let vid = self.next_ty_vid_in_universe(span, universe_map(ui));
|
||||||
|
// Fetch the `sub_root` in case it exists.
|
||||||
|
if let Some(prev) = previous_var_values.get(sub_root.as_usize()) {
|
||||||
|
if let &ty::Infer(ty::TyVar(sub_root)) = prev.expect_ty().kind() {
|
||||||
|
self.inner.borrow_mut().type_variables().sub(vid, sub_root);
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ty::new_var(self.tcx, vid).into()
|
||||||
|
}
|
||||||
|
|
||||||
CanonicalVarKind::Int => self.next_int_var().into(),
|
CanonicalVarKind::Int => self.next_int_var().into(),
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use std::iter;
|
|||||||
use rustc_index::{Idx, IndexVec};
|
use rustc_index::{Idx, IndexVec};
|
||||||
use rustc_middle::arena::ArenaAllocatable;
|
use rustc_middle::arena::ArenaAllocatable;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
|
use rustc_middle::infer::canonical::CanonicalVarKind;
|
||||||
use rustc_middle::ty::{self, BoundVar, GenericArg, GenericArgKind, Ty, TyCtxt, TypeFoldable};
|
use rustc_middle::ty::{self, BoundVar, GenericArg, GenericArgKind, Ty, TyCtxt, TypeFoldable};
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
@@ -413,26 +414,27 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
let mut opt_values: IndexVec<BoundVar, Option<GenericArg<'tcx>>> =
|
let mut opt_values: IndexVec<BoundVar, Option<GenericArg<'tcx>>> =
|
||||||
IndexVec::from_elem_n(None, query_response.variables.len());
|
IndexVec::from_elem_n(None, query_response.variables.len());
|
||||||
|
|
||||||
// In terms of our example above, we are iterating over pairs like:
|
|
||||||
// [(?A, Vec<?0>), ('static, '?1), (?B, ?0)]
|
|
||||||
for (original_value, result_value) in iter::zip(&original_values.var_values, result_values)
|
for (original_value, result_value) in iter::zip(&original_values.var_values, result_values)
|
||||||
{
|
{
|
||||||
match result_value.kind() {
|
match result_value.kind() {
|
||||||
GenericArgKind::Type(result_value) => {
|
GenericArgKind::Type(result_value) => {
|
||||||
// e.g., here `result_value` might be `?0` in the example above...
|
// We disable the instantiation guess for inference variables
|
||||||
if let ty::Bound(debruijn, b) = *result_value.kind() {
|
// and only use it for placeholders. We need to handle the
|
||||||
// ...in which case we would set `canonical_vars[0]` to `Some(?U)`.
|
// `sub_root` of type inference variables which would make this
|
||||||
|
// more involved. They are also a lot rarer than region variables.
|
||||||
|
if let ty::Bound(debruijn, b) = *result_value.kind()
|
||||||
|
&& !matches!(
|
||||||
|
query_response.variables[b.var.as_usize()],
|
||||||
|
CanonicalVarKind::Ty { .. }
|
||||||
|
)
|
||||||
|
{
|
||||||
// We only allow a `ty::INNERMOST` index in generic parameters.
|
// We only allow a `ty::INNERMOST` index in generic parameters.
|
||||||
assert_eq!(debruijn, ty::INNERMOST);
|
assert_eq!(debruijn, ty::INNERMOST);
|
||||||
opt_values[b.var] = Some(*original_value);
|
opt_values[b.var] = Some(*original_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GenericArgKind::Lifetime(result_value) => {
|
GenericArgKind::Lifetime(result_value) => {
|
||||||
// e.g., here `result_value` might be `'?1` in the example above...
|
|
||||||
if let ty::ReBound(debruijn, b) = result_value.kind() {
|
if let ty::ReBound(debruijn, b) = result_value.kind() {
|
||||||
// ... in which case we would set `canonical_vars[0]` to `Some('static)`.
|
|
||||||
|
|
||||||
// We only allow a `ty::INNERMOST` index in generic parameters.
|
// We only allow a `ty::INNERMOST` index in generic parameters.
|
||||||
assert_eq!(debruijn, ty::INNERMOST);
|
assert_eq!(debruijn, ty::INNERMOST);
|
||||||
opt_values[b.var] = Some(*original_value);
|
opt_values[b.var] = Some(*original_value);
|
||||||
@@ -440,8 +442,6 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
}
|
}
|
||||||
GenericArgKind::Const(result_value) => {
|
GenericArgKind::Const(result_value) => {
|
||||||
if let ty::ConstKind::Bound(debruijn, b) = result_value.kind() {
|
if let ty::ConstKind::Bound(debruijn, b) = result_value.kind() {
|
||||||
// ...in which case we would set `canonical_vars[0]` to `Some(const X)`.
|
|
||||||
|
|
||||||
// We only allow a `ty::INNERMOST` index in generic parameters.
|
// We only allow a `ty::INNERMOST` index in generic parameters.
|
||||||
assert_eq!(debruijn, ty::INNERMOST);
|
assert_eq!(debruijn, ty::INNERMOST);
|
||||||
opt_values[b.var] = Some(*original_value);
|
opt_values[b.var] = Some(*original_value);
|
||||||
@@ -453,32 +453,31 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
// Create result arguments: if we found a value for a
|
// Create result arguments: if we found a value for a
|
||||||
// given variable in the loop above, use that. Otherwise, use
|
// given variable in the loop above, use that. Otherwise, use
|
||||||
// a fresh inference variable.
|
// a fresh inference variable.
|
||||||
let result_args = CanonicalVarValues {
|
let mut var_values = Vec::with_capacity(query_response.variables.len());
|
||||||
var_values: self.tcx.mk_args_from_iter(
|
for (index, kind) in query_response.variables.iter().enumerate() {
|
||||||
query_response.variables.iter().enumerate().map(|(index, var_kind)| {
|
let value = if kind.universe() != ty::UniverseIndex::ROOT {
|
||||||
if var_kind.universe() != ty::UniverseIndex::ROOT {
|
// A variable from inside a binder of the query. While ideally these shouldn't
|
||||||
// A variable from inside a binder of the query. While ideally these shouldn't
|
// exist at all, we have to deal with them for now.
|
||||||
// exist at all, we have to deal with them for now.
|
self.instantiate_canonical_var(cause.span, kind, &var_values, |u| {
|
||||||
self.instantiate_canonical_var(cause.span, var_kind, |u| {
|
universe_map[u.as_usize()]
|
||||||
universe_map[u.as_usize()]
|
})
|
||||||
})
|
} else if kind.is_existential() {
|
||||||
} else if var_kind.is_existential() {
|
match opt_values[BoundVar::new(index)] {
|
||||||
match opt_values[BoundVar::new(index)] {
|
Some(k) => k,
|
||||||
Some(k) => k,
|
None => self.instantiate_canonical_var(cause.span, kind, &var_values, |u| {
|
||||||
None => self.instantiate_canonical_var(cause.span, var_kind, |u| {
|
universe_map[u.as_usize()]
|
||||||
universe_map[u.as_usize()]
|
}),
|
||||||
}),
|
}
|
||||||
}
|
} else {
|
||||||
} else {
|
// For placeholders which were already part of the input, we simply map this
|
||||||
// For placeholders which were already part of the input, we simply map this
|
// universal bound variable back the placeholder of the input.
|
||||||
// universal bound variable back the placeholder of the input.
|
opt_values[BoundVar::new(index)]
|
||||||
opt_values[BoundVar::new(index)].expect(
|
.expect("expected placeholder to be unified with itself during response")
|
||||||
"expected placeholder to be unified with itself during response",
|
};
|
||||||
)
|
var_values.push(value);
|
||||||
}
|
}
|
||||||
}),
|
|
||||||
),
|
let result_args = CanonicalVarValues { var_values: self.tcx.mk_args(&var_values) };
|
||||||
};
|
|
||||||
|
|
||||||
let mut obligations = PredicateObligations::new();
|
let mut obligations = PredicateObligations::new();
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ impl<'tcx> rustc_type_ir::InferCtxtLike for InferCtxt<'tcx> {
|
|||||||
self.root_var(var)
|
self.root_var(var)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sub_root_ty_var(&self, var: ty::TyVid) -> ty::TyVid {
|
||||||
|
self.sub_root_var(var)
|
||||||
|
}
|
||||||
|
|
||||||
fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid {
|
fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid {
|
||||||
self.root_const_var(var)
|
self.root_const_var(var)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ pub struct Canonicalizer<'a, D: SolverDelegate<Interner = I>, I: Interner> {
|
|||||||
variables: &'a mut Vec<I::GenericArg>,
|
variables: &'a mut Vec<I::GenericArg>,
|
||||||
var_kinds: Vec<CanonicalVarKind<I>>,
|
var_kinds: Vec<CanonicalVarKind<I>>,
|
||||||
variable_lookup_table: HashMap<I::GenericArg, usize>,
|
variable_lookup_table: HashMap<I::GenericArg, usize>,
|
||||||
|
sub_root_lookup_table: HashMap<ty::TyVid, usize>,
|
||||||
binder_index: ty::DebruijnIndex,
|
binder_index: ty::DebruijnIndex,
|
||||||
|
|
||||||
/// We only use the debruijn index during lookup. We don't need to
|
/// We only use the debruijn index during lookup. We don't need to
|
||||||
@@ -88,6 +89,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
|
|
||||||
variables,
|
variables,
|
||||||
variable_lookup_table: Default::default(),
|
variable_lookup_table: Default::default(),
|
||||||
|
sub_root_lookup_table: Default::default(),
|
||||||
var_kinds: Vec::new(),
|
var_kinds: Vec::new(),
|
||||||
binder_index: ty::INNERMOST,
|
binder_index: ty::INNERMOST,
|
||||||
|
|
||||||
@@ -132,6 +134,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
|
|
||||||
variables: &mut variables,
|
variables: &mut variables,
|
||||||
variable_lookup_table: Default::default(),
|
variable_lookup_table: Default::default(),
|
||||||
|
sub_root_lookup_table: Default::default(),
|
||||||
var_kinds: Vec::new(),
|
var_kinds: Vec::new(),
|
||||||
binder_index: ty::INNERMOST,
|
binder_index: ty::INNERMOST,
|
||||||
|
|
||||||
@@ -139,6 +142,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
};
|
};
|
||||||
let param_env = param_env.fold_with(&mut env_canonicalizer);
|
let param_env = param_env.fold_with(&mut env_canonicalizer);
|
||||||
debug_assert_eq!(env_canonicalizer.binder_index, ty::INNERMOST);
|
debug_assert_eq!(env_canonicalizer.binder_index, ty::INNERMOST);
|
||||||
|
debug_assert!(env_canonicalizer.sub_root_lookup_table.is_empty());
|
||||||
CanonicalParamEnvCacheEntry {
|
CanonicalParamEnvCacheEntry {
|
||||||
param_env,
|
param_env,
|
||||||
variable_lookup_table: env_canonicalizer.variable_lookup_table,
|
variable_lookup_table: env_canonicalizer.variable_lookup_table,
|
||||||
@@ -164,6 +168,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
|
|
||||||
variables,
|
variables,
|
||||||
variable_lookup_table: Default::default(),
|
variable_lookup_table: Default::default(),
|
||||||
|
sub_root_lookup_table: Default::default(),
|
||||||
var_kinds: Vec::new(),
|
var_kinds: Vec::new(),
|
||||||
binder_index: ty::INNERMOST,
|
binder_index: ty::INNERMOST,
|
||||||
|
|
||||||
@@ -171,6 +176,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
};
|
};
|
||||||
let param_env = param_env.fold_with(&mut env_canonicalizer);
|
let param_env = param_env.fold_with(&mut env_canonicalizer);
|
||||||
debug_assert_eq!(env_canonicalizer.binder_index, ty::INNERMOST);
|
debug_assert_eq!(env_canonicalizer.binder_index, ty::INNERMOST);
|
||||||
|
debug_assert!(env_canonicalizer.sub_root_lookup_table.is_empty());
|
||||||
(param_env, env_canonicalizer.variable_lookup_table, env_canonicalizer.var_kinds)
|
(param_env, env_canonicalizer.variable_lookup_table, env_canonicalizer.var_kinds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,6 +205,7 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
|
|
||||||
variables,
|
variables,
|
||||||
variable_lookup_table,
|
variable_lookup_table,
|
||||||
|
sub_root_lookup_table: Default::default(),
|
||||||
var_kinds,
|
var_kinds,
|
||||||
binder_index: ty::INNERMOST,
|
binder_index: ty::INNERMOST,
|
||||||
|
|
||||||
@@ -265,6 +272,13 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
ty::BoundVar::from(idx)
|
ty::BoundVar::from(idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_or_insert_sub_root(&mut self, vid: ty::TyVid) -> ty::BoundVar {
|
||||||
|
let root_vid = self.delegate.sub_root_ty_var(vid);
|
||||||
|
let idx =
|
||||||
|
*self.sub_root_lookup_table.entry(root_vid).or_insert_with(|| self.variables.len());
|
||||||
|
ty::BoundVar::from(idx)
|
||||||
|
}
|
||||||
|
|
||||||
fn finalize(self) -> (ty::UniverseIndex, I::CanonicalVarKinds) {
|
fn finalize(self) -> (ty::UniverseIndex, I::CanonicalVarKinds) {
|
||||||
let mut var_kinds = self.var_kinds;
|
let mut var_kinds = self.var_kinds;
|
||||||
// See the rustc-dev-guide section about how we deal with universes
|
// See the rustc-dev-guide section about how we deal with universes
|
||||||
@@ -312,16 +326,15 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
|
|||||||
"ty vid should have been resolved fully before canonicalization"
|
"ty vid should have been resolved fully before canonicalization"
|
||||||
);
|
);
|
||||||
|
|
||||||
match self.canonicalize_mode {
|
let sub_root = self.get_or_insert_sub_root(vid);
|
||||||
CanonicalizeMode::Input { .. } => {
|
let ui = match self.canonicalize_mode {
|
||||||
CanonicalVarKind::Ty(ty::UniverseIndex::ROOT)
|
CanonicalizeMode::Input { .. } => ty::UniverseIndex::ROOT,
|
||||||
}
|
CanonicalizeMode::Response { .. } => self
|
||||||
CanonicalizeMode::Response { .. } => {
|
.delegate
|
||||||
CanonicalVarKind::Ty(self.delegate.universe_of_ty(vid).unwrap_or_else(
|
.universe_of_ty(vid)
|
||||||
|| panic!("ty var should have been resolved: {t:?}"),
|
.unwrap_or_else(|| panic!("ty var should have been resolved: {t:?}")),
|
||||||
))
|
};
|
||||||
}
|
CanonicalVarKind::Ty { ui, sub_root }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ty::IntVar(vid) => {
|
ty::IntVar(vid) => {
|
||||||
debug_assert_eq!(
|
debug_assert_eq!(
|
||||||
|
|||||||
@@ -57,12 +57,14 @@ pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
|
|||||||
where
|
where
|
||||||
V: TypeFoldable<Self::Interner>;
|
V: TypeFoldable<Self::Interner>;
|
||||||
|
|
||||||
fn instantiate_canonical_var_with_infer(
|
fn instantiate_canonical_var(
|
||||||
&self,
|
&self,
|
||||||
kind: ty::CanonicalVarKind<Self::Interner>,
|
kind: ty::CanonicalVarKind<Self::Interner>,
|
||||||
span: <Self::Interner as Interner>::Span,
|
span: <Self::Interner as Interner>::Span,
|
||||||
|
var_values: &[<Self::Interner as Interner>::GenericArg],
|
||||||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||||
) -> <Self::Interner as Interner>::GenericArg;
|
) -> <Self::Interner as Interner>::GenericArg;
|
||||||
|
|
||||||
fn add_item_bounds_for_hidden_type(
|
fn add_item_bounds_for_hidden_type(
|
||||||
&self,
|
&self,
|
||||||
def_id: <Self::Interner as Interner>::DefId,
|
def_id: <Self::Interner as Interner>::DefId,
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ use rustc_type_ir::data_structures::HashSet;
|
|||||||
use rustc_type_ir::inherent::*;
|
use rustc_type_ir::inherent::*;
|
||||||
use rustc_type_ir::relate::solver_relating::RelateExt;
|
use rustc_type_ir::relate::solver_relating::RelateExt;
|
||||||
use rustc_type_ir::{
|
use rustc_type_ir::{
|
||||||
self as ty, Canonical, CanonicalVarValues, InferCtxtLike, Interner, TypeFoldable,
|
self as ty, Canonical, CanonicalVarKind, CanonicalVarValues, InferCtxtLike, Interner,
|
||||||
|
TypeFoldable,
|
||||||
};
|
};
|
||||||
use tracing::{debug, instrument, trace};
|
use tracing::{debug, instrument, trace};
|
||||||
|
|
||||||
@@ -336,7 +337,16 @@ where
|
|||||||
{
|
{
|
||||||
match result_value.kind() {
|
match result_value.kind() {
|
||||||
ty::GenericArgKind::Type(t) => {
|
ty::GenericArgKind::Type(t) => {
|
||||||
if let ty::Bound(debruijn, b) = t.kind() {
|
// We disable the instantiation guess for inference variables
|
||||||
|
// and only use it for placeholders. We need to handle the
|
||||||
|
// `sub_root` of type inference variables which would make this
|
||||||
|
// more involved. They are also a lot rarer than region variables.
|
||||||
|
if let ty::Bound(debruijn, b) = t.kind()
|
||||||
|
&& !matches!(
|
||||||
|
response.variables.get(b.var().as_usize()).unwrap(),
|
||||||
|
CanonicalVarKind::Ty { .. }
|
||||||
|
)
|
||||||
|
{
|
||||||
assert_eq!(debruijn, ty::INNERMOST);
|
assert_eq!(debruijn, ty::INNERMOST);
|
||||||
opt_values[b.var()] = Some(*original_value);
|
opt_values[b.var()] = Some(*original_value);
|
||||||
}
|
}
|
||||||
@@ -356,38 +366,37 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let var_values = delegate.cx().mk_args_from_iter(
|
let mut var_values = Vec::with_capacity(response.variables.len());
|
||||||
response.variables.iter().enumerate().map(|(index, var_kind)| {
|
for (index, kind) in response.variables.iter().enumerate() {
|
||||||
if var_kind.universe() != ty::UniverseIndex::ROOT {
|
let value = if kind.universe() != ty::UniverseIndex::ROOT {
|
||||||
// A variable from inside a binder of the query. While ideally these shouldn't
|
// A variable from inside a binder of the query. While ideally these shouldn't
|
||||||
// exist at all (see the FIXME at the start of this method), we have to deal with
|
// exist at all (see the FIXME at the start of this method), we have to deal with
|
||||||
// them for now.
|
// them for now.
|
||||||
delegate.instantiate_canonical_var_with_infer(var_kind, span, |idx| {
|
delegate.instantiate_canonical_var(kind, span, &var_values, |idx| {
|
||||||
prev_universe + idx.index()
|
prev_universe + idx.index()
|
||||||
})
|
})
|
||||||
} else if var_kind.is_existential() {
|
} else if kind.is_existential() {
|
||||||
// As an optimization we sometimes avoid creating a new inference variable here.
|
// As an optimization we sometimes avoid creating a new inference variable here.
|
||||||
//
|
//
|
||||||
// All new inference variables we create start out in the current universe of the caller.
|
// All new inference variables we create start out in the current universe of the caller.
|
||||||
// This is conceptually wrong as these inference variables would be able to name
|
// This is conceptually wrong as these inference variables would be able to name
|
||||||
// more placeholders then they should be able to. However the inference variables have
|
// more placeholders then they should be able to. However the inference variables have
|
||||||
// to "come from somewhere", so by equating them with the original values of the caller
|
// to "come from somewhere", so by equating them with the original values of the caller
|
||||||
// later on, we pull them down into their correct universe again.
|
// later on, we pull them down into their correct universe again.
|
||||||
if let Some(v) = opt_values[ty::BoundVar::from_usize(index)] {
|
if let Some(v) = opt_values[ty::BoundVar::from_usize(index)] {
|
||||||
v
|
v
|
||||||
} else {
|
|
||||||
delegate
|
|
||||||
.instantiate_canonical_var_with_infer(var_kind, span, |_| prev_universe)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// For placeholders which were already part of the input, we simply map this
|
delegate.instantiate_canonical_var(kind, span, &var_values, |_| prev_universe)
|
||||||
// universal bound variable back the placeholder of the input.
|
|
||||||
original_values[var_kind.expect_placeholder_index()]
|
|
||||||
}
|
}
|
||||||
}),
|
} else {
|
||||||
);
|
// For placeholders which were already part of the input, we simply map this
|
||||||
|
// universal bound variable back the placeholder of the input.
|
||||||
|
original_values[kind.expect_placeholder_index()]
|
||||||
|
};
|
||||||
|
var_values.push(value)
|
||||||
|
}
|
||||||
|
|
||||||
CanonicalVarValues { var_values }
|
CanonicalVarValues { var_values: delegate.cx().mk_args(&var_values) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unify the `original_values` with the `var_values` returned by the canonical query..
|
/// Unify the `original_values` with the `var_values` returned by the canonical query..
|
||||||
|
|||||||
@@ -418,6 +418,11 @@ pub struct GoalEvaluation<I: Interner> {
|
|||||||
pub has_changed: HasChanged,
|
pub has_changed: HasChanged,
|
||||||
/// If the [`Certainty`] was `Maybe`, then keep track of whether the goal has changed
|
/// If the [`Certainty`] was `Maybe`, then keep track of whether the goal has changed
|
||||||
/// before rerunning it.
|
/// before rerunning it.
|
||||||
|
///
|
||||||
|
/// We knowingly ignore the `sub_root` of our inference variables here. This means we
|
||||||
|
/// may not reevaluate a goal even though a change to the `sub_root` could cause a goal
|
||||||
|
/// to make progress. Tracking them adds additional complexity for an incredibly minor
|
||||||
|
/// type inference improvement. We could look into properly handling this in the future.
|
||||||
pub stalled_on: Option<GoalStalledOn<I>>,
|
pub stalled_on: Option<GoalStalledOn<I>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -237,13 +237,14 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
|
|||||||
canonical.instantiate(self.tcx, &values)
|
canonical.instantiate(self.tcx, &values)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn instantiate_canonical_var_with_infer(
|
fn instantiate_canonical_var(
|
||||||
&self,
|
&self,
|
||||||
kind: CanonicalVarKind<'tcx>,
|
kind: CanonicalVarKind<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
|
var_values: &[ty::GenericArg<'tcx>],
|
||||||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||||
) -> ty::GenericArg<'tcx> {
|
) -> ty::GenericArg<'tcx> {
|
||||||
self.0.instantiate_canonical_var(span, kind, universe_map)
|
self.0.instantiate_canonical_var(span, kind, var_values, universe_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_item_bounds_for_hidden_type(
|
fn add_item_bounds_for_hidden_type(
|
||||||
|
|||||||
@@ -91,7 +91,11 @@ impl<I: Interner, V: fmt::Display> fmt::Display for Canonical<I, V> {
|
|||||||
)]
|
)]
|
||||||
pub enum CanonicalVarKind<I: Interner> {
|
pub enum CanonicalVarKind<I: Interner> {
|
||||||
/// General type variable `?T` that can be unified with arbitrary types.
|
/// General type variable `?T` that can be unified with arbitrary types.
|
||||||
Ty(UniverseIndex),
|
///
|
||||||
|
/// We also store the index of the first type variable which is sub-unified
|
||||||
|
/// with this one. If there is no inference variable related to this one,
|
||||||
|
/// its `sub_root` just points to itself.
|
||||||
|
Ty { ui: UniverseIndex, sub_root: ty::BoundVar },
|
||||||
|
|
||||||
/// Integral type variable `?I` (that can only be unified with integral types).
|
/// Integral type variable `?I` (that can only be unified with integral types).
|
||||||
Int,
|
Int,
|
||||||
@@ -122,7 +126,7 @@ impl<I: Interner> Eq for CanonicalVarKind<I> {}
|
|||||||
impl<I: Interner> CanonicalVarKind<I> {
|
impl<I: Interner> CanonicalVarKind<I> {
|
||||||
pub fn universe(self) -> UniverseIndex {
|
pub fn universe(self) -> UniverseIndex {
|
||||||
match self {
|
match self {
|
||||||
CanonicalVarKind::Ty(ui) => ui,
|
CanonicalVarKind::Ty { ui, sub_root: _ } => ui,
|
||||||
CanonicalVarKind::Region(ui) => ui,
|
CanonicalVarKind::Region(ui) => ui,
|
||||||
CanonicalVarKind::Const(ui) => ui,
|
CanonicalVarKind::Const(ui) => ui,
|
||||||
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
|
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
|
||||||
@@ -138,7 +142,7 @@ impl<I: Interner> CanonicalVarKind<I> {
|
|||||||
/// the updated universe is not the root.
|
/// the updated universe is not the root.
|
||||||
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
|
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
|
||||||
match self {
|
match self {
|
||||||
CanonicalVarKind::Ty(_) => CanonicalVarKind::Ty(ui),
|
CanonicalVarKind::Ty { ui: _, sub_root } => CanonicalVarKind::Ty { ui, sub_root },
|
||||||
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
|
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
|
||||||
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
|
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
|
||||||
|
|
||||||
@@ -160,7 +164,7 @@ impl<I: Interner> CanonicalVarKind<I> {
|
|||||||
|
|
||||||
pub fn is_existential(self) -> bool {
|
pub fn is_existential(self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
CanonicalVarKind::Ty(_)
|
CanonicalVarKind::Ty { .. }
|
||||||
| CanonicalVarKind::Int
|
| CanonicalVarKind::Int
|
||||||
| CanonicalVarKind::Float
|
| CanonicalVarKind::Float
|
||||||
| CanonicalVarKind::Region(_)
|
| CanonicalVarKind::Region(_)
|
||||||
@@ -174,7 +178,7 @@ impl<I: Interner> CanonicalVarKind<I> {
|
|||||||
pub fn is_region(self) -> bool {
|
pub fn is_region(self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
|
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
|
||||||
CanonicalVarKind::Ty(_)
|
CanonicalVarKind::Ty { .. }
|
||||||
| CanonicalVarKind::Int
|
| CanonicalVarKind::Int
|
||||||
| CanonicalVarKind::Float
|
| CanonicalVarKind::Float
|
||||||
| CanonicalVarKind::PlaceholderTy(_)
|
| CanonicalVarKind::PlaceholderTy(_)
|
||||||
@@ -185,7 +189,7 @@ impl<I: Interner> CanonicalVarKind<I> {
|
|||||||
|
|
||||||
pub fn expect_placeholder_index(self) -> usize {
|
pub fn expect_placeholder_index(self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
CanonicalVarKind::Ty(_)
|
CanonicalVarKind::Ty { .. }
|
||||||
| CanonicalVarKind::Int
|
| CanonicalVarKind::Int
|
||||||
| CanonicalVarKind::Float
|
| CanonicalVarKind::Float
|
||||||
| CanonicalVarKind::Region(_)
|
| CanonicalVarKind::Region(_)
|
||||||
@@ -275,7 +279,7 @@ impl<I: Interner> CanonicalVarValues<I> {
|
|||||||
var_values: cx.mk_args_from_iter(infos.iter().enumerate().map(
|
var_values: cx.mk_args_from_iter(infos.iter().enumerate().map(
|
||||||
|(i, kind)| -> I::GenericArg {
|
|(i, kind)| -> I::GenericArg {
|
||||||
match kind {
|
match kind {
|
||||||
CanonicalVarKind::Ty(_)
|
CanonicalVarKind::Ty { .. }
|
||||||
| CanonicalVarKind::Int
|
| CanonicalVarKind::Int
|
||||||
| CanonicalVarKind::Float
|
| CanonicalVarKind::Float
|
||||||
| CanonicalVarKind::PlaceholderTy(_) => {
|
| CanonicalVarKind::PlaceholderTy(_) => {
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ pub trait InferCtxtLike: Sized {
|
|||||||
fn universe_of_ct(&self, ct: ty::ConstVid) -> Option<ty::UniverseIndex>;
|
fn universe_of_ct(&self, ct: ty::ConstVid) -> Option<ty::UniverseIndex>;
|
||||||
|
|
||||||
fn root_ty_var(&self, var: ty::TyVid) -> ty::TyVid;
|
fn root_ty_var(&self, var: ty::TyVid) -> ty::TyVid;
|
||||||
|
fn sub_root_ty_var(&self, var: ty::TyVid) -> ty::TyVid;
|
||||||
fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid;
|
fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid;
|
||||||
|
|
||||||
fn opportunistic_resolve_ty_var(&self, vid: ty::TyVid) -> <Self::Interner as Interner>::Ty;
|
fn opportunistic_resolve_ty_var(&self, vid: ty::TyVid) -> <Self::Interner as Interner>::Ty;
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
// MIR for `address_of_reborrow` after SimplifyCfg-initial
|
// MIR for `address_of_reborrow` after SimplifyCfg-initial
|
||||||
|
|
||||||
| User Type Annotations
|
| User Type Annotations
|
||||||
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
|
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
|
||||||
| 1: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:10:10: 10:25, inferred_ty: *const dyn std::marker::Send
|
| 1: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:10:10: 10:25, inferred_ty: *const dyn std::marker::Send
|
||||||
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
|
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
|
||||||
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
|
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
|
||||||
| 4: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
|
| 4: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
|
||||||
| 5: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
|
| 5: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
|
||||||
| 6: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
|
| 6: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
|
||||||
| 7: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
|
| 7: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
|
||||||
| 8: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
|
| 8: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
|
||||||
| 9: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
|
| 9: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
|
||||||
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
|
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
|
||||||
| 11: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:21:10: 21:25, inferred_ty: *const dyn std::marker::Send
|
| 11: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:21:10: 21:25, inferred_ty: *const dyn std::marker::Send
|
||||||
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
|
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
|
||||||
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
|
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
|
||||||
| 14: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
|
| 14: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
|
||||||
| 15: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
|
| 15: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
|
||||||
| 16: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
|
| 16: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
|
||||||
| 17: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
|
| 17: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
|
||||||
| 18: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
|
| 18: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
|
||||||
| 19: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
|
| 19: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
|
||||||
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
|
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
|
||||||
| 21: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:31:10: 31:23, inferred_ty: *mut dyn std::marker::Send
|
| 21: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:31:10: 31:23, inferred_ty: *mut dyn std::marker::Send
|
||||||
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
|
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
|
||||||
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
|
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty { ui: U0, sub_root: 0 }] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
|
||||||
| 24: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
|
| 24: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
|
||||||
| 25: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
|
| 25: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
|
||||||
| 26: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:36:12: 36:25, inferred_ty: *mut dyn std::marker::Send
|
| 26: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:36:12: 36:25, inferred_ty: *mut dyn std::marker::Send
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<svg width="2322px" height="4322px" xmlns="http://www.w3.org/2000/svg">
|
<svg width="2238px" height="3890px" xmlns="http://www.w3.org/2000/svg">
|
||||||
<style>
|
<style>
|
||||||
.fg { fill: #AAAAAA }
|
.fg { fill: #AAAAAA }
|
||||||
.bg { background: #000000 }
|
.bg { background: #000000 }
|
||||||
@@ -129,375 +129,327 @@
|
|||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="982px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
<tspan x="10px" y="982px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1000px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:16:10: 16:13}>> as IntoIterator>::IntoIter = _`</tspan>
|
<tspan x="10px" y="1000px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1018px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="1018px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1036px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:16:10: 16:13}>> as IntoIterator>::Item = _`</tspan>
|
<tspan x="10px" y="1036px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1054px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="1054px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1072px"><tspan> `Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:16:10: 16:13}>>: IntoIterator`</tspan>
|
<tspan x="10px" y="1072px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:32:6</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1090px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="1090px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1108px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="1108px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1126px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:14:8: 14:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="1126px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1144px">
|
<tspan x="10px" y="1144px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1162px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="1162px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1180px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:32:6</tspan>
|
<tspan x="10px" y="1180px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1198px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1198px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1216px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
<tspan x="10px" y="1216px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1234px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="1234px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1252px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1252px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1270px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="1270px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1288px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="1288px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- .map(|t| (is_true, t))</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1306px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
<tspan x="10px" y="1306px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1324px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
<tspan x="10px" y="1324px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1342px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
<tspan x="10px" y="1342px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1360px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1360px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1378px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="1378px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:28:2</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1396px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- .map(|t| (is_true, t))</tspan>
|
<tspan x="10px" y="1396px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1414px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="1414px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1432px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1432px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1450px">
|
<tspan x="10px" y="1450px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1468px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="1468px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|t| (is_true, t))</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1486px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:28:2</tspan>
|
<tspan x="10px" y="1486px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1504px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1504px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1522px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="1522px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1540px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="1540px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1558px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="1558px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1576px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|t| (is_true, t))</tspan>
|
<tspan x="10px" y="1576px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1594px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .flatten()</tspan>
|
<tspan x="10px" y="1594px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1612px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
<tspan x="10px" y="1612px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1630px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="1630px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1648px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1648px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>`, but its trait bounds were not satisfied</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1666px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="1666px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:35:4</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1684px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="1684px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1702px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
<tspan x="10px" y="1702px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1720px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
<tspan x="10px" y="1720px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1738px">
|
<tspan x="10px" y="1738px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1756px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>`, but its trait bounds were not satisfied</tspan>
|
<tspan x="10px" y="1756px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t))</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1774px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:35:4</tspan>
|
<tspan x="10px" y="1774px"><tspan class="fg-ansi256-012 bold">...</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1792px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1792px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1810px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="1810px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1828px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="1828px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1846px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="1846px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1864px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t))</tspan>
|
<tspan x="10px" y="1864px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1882px"><tspan class="fg-ansi256-012 bold">...</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1882px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1900px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
<tspan x="10px" y="1900px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1918px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
<tspan x="10px" y="1918px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1936px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
<tspan x="10px" y="1936px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1954px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
<tspan x="10px" y="1954px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1972px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1972px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="1990px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="1990px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:43:7</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2008px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
<tspan x="10px" y="2008px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2026px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:31:10: 31:13}>> as IntoIterator>::IntoIter = _`</tspan>
|
<tspan x="10px" y="2026px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> }).flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2044px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="2044px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2062px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:31:10: 31:13}>> as IntoIterator>::Item = _`</tspan>
|
<tspan x="10px" y="2062px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2080px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="2080px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2098px"><tspan> `Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:31:10: 31:13}>>: IntoIterator`</tspan>
|
<tspan x="10px" y="2098px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2116px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="2116px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2134px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="2134px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2152px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:29:8: 29:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="2152px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2170px">
|
<tspan x="10px" y="2170px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2188px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="2188px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan><tspan class="fg-ansi256-009">.map(|t| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2206px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:43:7</tspan>
|
<tspan x="10px" y="2206px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- (is_true, t)</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2224px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2224px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- })</tspan><tspan>.flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2242px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> }).flatten()</tspan>
|
<tspan x="10px" y="2242px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter().flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2260px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="2260px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2278px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2278px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2296px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="2296px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2314px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="2314px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:39:2</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2332px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
<tspan x="10px" y="2332px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2350px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
<tspan x="10px" y="2350px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2368px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
<tspan x="10px" y="2368px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2386px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2386px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter().map(|t| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2404px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan><tspan class="fg-ansi256-009">.map(|t| {</tspan>
|
<tspan x="10px" y="2404px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> (is_true, t)</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2422px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- (is_true, t)</tspan>
|
<tspan x="10px" y="2422px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> }).flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2440px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- })</tspan><tspan>.flatten()</tspan>
|
<tspan x="10px" y="2440px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2458px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter().flatten()</tspan>
|
<tspan x="10px" y="2458px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2476px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2476px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2494px">
|
<tspan x="10px" y="2494px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2512px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="2512px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2530px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:39:2</tspan>
|
<tspan x="10px" y="2530px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2548px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2548px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2566px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="2566px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2584px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="2584px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>`, but its trait bounds were not satisfied</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2602px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter().map(|t| {</tspan>
|
<tspan x="10px" y="2602px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:46:4</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2620px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> (is_true, t)</tspan>
|
<tspan x="10px" y="2620px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2638px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> }).flatten()</tspan>
|
<tspan x="10px" y="2638px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2656px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
<tspan x="10px" y="2656px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2674px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="2674px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter().map(|t| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2692px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2692px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> (is_true, t)</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2710px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="2710px"><tspan class="fg-ansi256-012 bold">...</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2728px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="2728px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2746px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
<tspan x="10px" y="2746px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2764px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
<tspan x="10px" y="2764px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2782px">
|
<tspan x="10px" y="2782px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2800px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>`, but its trait bounds were not satisfied</tspan>
|
<tspan x="10px" y="2800px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2818px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:46:4</tspan>
|
<tspan x="10px" y="2818px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2836px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2836px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2854px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="2854px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2872px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="2872px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2890px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter().map(|t| {</tspan>
|
<tspan x="10px" y="2890px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2908px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> (is_true, t)</tspan>
|
<tspan x="10px" y="2908px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2926px"><tspan class="fg-ansi256-012 bold">...</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="2926px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:53:28</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2944px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
<tspan x="10px" y="2944px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2962px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
<tspan x="10px" y="2962px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2980px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
<tspan x="10px" y="2980px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="2998px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
<tspan x="10px" y="2998px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3016px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3016px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3034px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3034px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3052px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
<tspan x="10px" y="3052px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3070px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:41:23: 41:26}>> as IntoIterator>::IntoIter = _`</tspan>
|
<tspan x="10px" y="3070px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3088px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="3088px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3106px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:41:23: 41:26}>> as IntoIterator>::Item = _`</tspan>
|
<tspan x="10px" y="3106px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3124px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="3124px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3142px"><tspan> `Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:41:23: 41:26}>>: IntoIterator`</tspan>
|
<tspan x="10px" y="3142px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- .map(|t| (is_true, t))</tspan><tspan>.flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3160px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="3160px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter().flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3178px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="3178px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3196px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:40:8: 40:23}>>: Iterator`</tspan>
|
<tspan x="10px" y="3196px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3214px">
|
<tspan x="10px" y="3214px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3232px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="3232px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:50:2</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3250px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:53:28</tspan>
|
<tspan x="10px" y="3250px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3268px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3268px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3286px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
<tspan x="10px" y="3286px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3304px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="3304px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3322px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3322px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3340px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="3340px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3358px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="3358px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3376px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `flatten`</tspan>
|
<tspan x="10px" y="3376px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3394px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL</tspan>
|
<tspan x="10px" y="3394px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3412px"><tspan class="fg-ansi256-014 bold">help</tspan><tspan>: consider removing this method call, as the receiver has type `std::vec::IntoIter<HashSet<u8>>` and `std::vec::IntoIter<HashSet<u8>>: Iterator` trivially holds</tspan>
|
<tspan x="10px" y="3412px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3430px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3430px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3448px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- </tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="3448px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3466px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-009">- .map(|t| (is_true, t))</tspan><tspan>.flatten()</tspan>
|
<tspan x="10px" y="3466px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3484px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-010">+ </tspan><tspan> ts.into_iter().flatten()</tspan>
|
<tspan x="10px" y="3484px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>`, but its trait bounds were not satisfied</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3502px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3502px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:56:4</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3520px">
|
<tspan x="10px" y="3520px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3538px"><tspan class="fg-ansi256-009 bold">error[E0277]</tspan><tspan class="bold">: `(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="3538px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3556px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:50:2</tspan>
|
<tspan x="10px" y="3556px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3574px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3574px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3592px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="3592px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3610px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="3610px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> })</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3628px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
<tspan x="10px" y="3628px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3646px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
<tspan x="10px" y="3646px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3664px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|</tspan><tspan> })</tspan>
|
<tspan x="10px" y="3664px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3682px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">|__________^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">`(bool, HashSet<u8>)` is not an iterator</tspan>
|
<tspan x="10px" y="3682px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3700px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3700px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3718px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">help</tspan><tspan>: the trait `Iterator` is not implemented for `(bool, HashSet<u8>)`</tspan>
|
<tspan x="10px" y="3718px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3736px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: required for `(bool, HashSet<u8>)` to implement `IntoIterator`</tspan>
|
<tspan x="10px" y="3736px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3754px"><tspan class="fg-ansi256-010 bold">note</tspan><tspan>: required by a bound in `Flatten`</tspan>
|
<tspan x="10px" y="3754px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3772px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL</tspan>
|
<tspan x="10px" y="3772px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3790px">
|
<tspan x="10px" y="3790px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3808px"><tspan class="fg-ansi256-009 bold">error[E0599]</tspan><tspan class="bold">: the method `collect` exists for struct `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>`, but its trait bounds were not satisfied</tspan>
|
<tspan x="10px" y="3808px"><tspan class="fg-ansi256-009 bold">error</tspan><tspan class="bold">: aborting due to 12 previous errors</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3826px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">--> </tspan><tspan>$DIR/multiline-removal-suggestion.rs:56:4</tspan>
|
<tspan x="10px" y="3826px">
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3844px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
<tspan x="10px" y="3844px"><tspan class="bold">Some errors have detailed explanations: E0277, E0599.</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3862px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">/</tspan><tspan> hm.into_iter()</tspan>
|
<tspan x="10px" y="3862px"><tspan class="bold">For more information about an error, try `rustc --explain E0277`.</tspan>
|
||||||
</tspan>
|
</tspan>
|
||||||
<tspan x="10px" y="3880px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|(is_true, ts)| {</tspan>
|
<tspan x="10px" y="3880px">
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3898px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> ts.into_iter()</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3916px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .map(|t| (is_true, t)).flatten()</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3934px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> })</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3952px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .flatten()</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3970px"><tspan class="fg-ansi256-012 bold">LL</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> .collect()</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="3988px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">-</tspan><tspan class="fg-ansi256-009 bold">^^^^^^^</tspan><tspan> </tspan><tspan class="fg-ansi256-009 bold">method cannot be called due to unsatisfied trait bounds</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4006px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan><tspan> </tspan><tspan class="fg-ansi256-012 bold">|_________|</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4024px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4042px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">|</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4060px"><tspan> </tspan><tspan class="fg-ansi256-012 bold">= </tspan><tspan class="bold">note</tspan><tspan>: the following trait bounds were not satisfied:</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4078px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:53:10: 53:13}>> as IntoIterator>::IntoIter = _`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4096px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4114px"><tspan> `<Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:53:10: 53:13}>> as IntoIterator>::Item = _`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4132px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4150px"><tspan> `Flatten<Map<std::vec::IntoIter<HashSet<u8>>, {closure@$DIR/multiline-removal-suggestion.rs:53:10: 53:13}>>: IntoIterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4168px"><tspan> which is required by `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4186px"><tspan> `Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4204px"><tspan> which is required by `&mut Flatten<Map<std::collections::hash_map::IntoIter<bool, Vec<HashSet<u8>>>, {closure@$DIR/multiline-removal-suggestion.rs:51:8: 51:23}>>: Iterator`</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4222px">
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4240px"><tspan class="fg-ansi256-009 bold">error</tspan><tspan class="bold">: aborting due to 12 previous errors</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4258px">
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4276px"><tspan class="bold">Some errors have detailed explanations: E0277, E0599.</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4294px"><tspan class="bold">For more information about an error, try `rustc --explain E0277`.</tspan>
|
|
||||||
</tspan>
|
|
||||||
<tspan x="10px" y="4312px">
|
|
||||||
</tspan>
|
</tspan>
|
||||||
</text>
|
</text>
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 40 KiB |
@@ -1,14 +1,24 @@
|
|||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed for `(_,)`
|
||||||
--> $DIR/recursive-in-exhaustiveness.rs:19:17
|
--> $DIR/recursive-in-exhaustiveness.rs:19:9
|
||||||
|
|
|
|
||||||
LL | let (x,) = (build(x),);
|
LL | let (x,) = (build(x),);
|
||||||
| ^^^^^^^^ cannot infer type
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: consider giving this pattern a type, where the placeholders `_` are specified
|
||||||
|
|
|
||||||
|
LL | let (x,): (_,) = (build(x),);
|
||||||
|
| ++++++
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed for `((_,),)`
|
||||||
--> $DIR/recursive-in-exhaustiveness.rs:29:17
|
--> $DIR/recursive-in-exhaustiveness.rs:29:9
|
||||||
|
|
|
|
||||||
LL | let (x,) = (build2(x),);
|
LL | let (x,) = (build2(x),);
|
||||||
| ^^^^^^^^^ cannot infer type
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: consider giving this pattern a type, where the placeholders `_` are specified
|
||||||
|
|
|
||||||
|
LL | let (x,): ((_,),) = (build2(x),);
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/recursive-in-exhaustiveness.rs:40:5
|
--> $DIR/recursive-in-exhaustiveness.rs:40:5
|
||||||
|
|||||||
Reference in New Issue
Block a user