Address review comments from #98259
It got merged so fast I didn't have time to make changes xD
This commit is contained in:
parent
1deca0425d
commit
b052d76586
7 changed files with 27 additions and 31 deletions
|
|
@ -74,7 +74,7 @@ use std::mem;
|
|||
use std::ops::{Bound, Deref};
|
||||
use std::sync::Arc;
|
||||
|
||||
use super::RvalueScopes;
|
||||
use super::{ImplPolarity, RvalueScopes};
|
||||
|
||||
pub trait OnDiskCache<'tcx>: rustc_data_structures::sync::Sync {
|
||||
/// Creates a new `OnDiskCache` instance from the serialized data in `data`.
|
||||
|
|
@ -2224,6 +2224,20 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
/// Given a `ty`, return whether it's an `impl Future<...>`.
|
||||
pub fn ty_is_opaque_future(self, ty: Ty<'_>) -> bool {
|
||||
let ty::Opaque(def_id, _) = ty.kind() else { return false };
|
||||
let future_trait = self.lang_items().future_trait().unwrap();
|
||||
|
||||
self.explicit_item_bounds(def_id).iter().any(|(predicate, _)| {
|
||||
let ty::PredicateKind::Trait(trait_predicate) = predicate.kind().skip_binder() else {
|
||||
return false;
|
||||
};
|
||||
trait_predicate.trait_ref.def_id == future_trait
|
||||
&& trait_predicate.polarity == ImplPolarity::Positive
|
||||
})
|
||||
}
|
||||
|
||||
/// Computes the def-ids of the transitive supertraits of `trait_def_id`. This (intentionally)
|
||||
/// does not compute the full elaborated super-predicates but just the set of def-ids. It is used
|
||||
/// to identify which traits may define a given associated type to help avoid cycle errors.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ use crate::infer::InferCtxt;
|
|||
use crate::traits::normalize_to;
|
||||
|
||||
use hir::HirId;
|
||||
use rustc_ast::Movability;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::{
|
||||
|
|
@ -2406,19 +2405,6 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
}
|
||||
};
|
||||
|
||||
let future_trait = self.tcx.lang_items().future_trait().unwrap();
|
||||
let opaque_ty_is_future = |def_id| {
|
||||
self.tcx.explicit_item_bounds(def_id).iter().any(|(predicate, _)| {
|
||||
if let ty::PredicateKind::Trait(trait_predicate) =
|
||||
predicate.kind().skip_binder()
|
||||
{
|
||||
trait_predicate.trait_ref.def_id == future_trait
|
||||
} else {
|
||||
false
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
let from_generator = tcx.lang_items().from_generator_fn().unwrap();
|
||||
|
||||
// Don't print the tuple of capture types
|
||||
|
|
@ -2444,13 +2430,13 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
|
||||
// If the previous type is `from_generator`, this is the future generated by the body of an async function.
|
||||
// Avoid printing it twice (it was already printed in the `ty::Generator` arm below).
|
||||
let is_future = opaque_ty_is_future(def_id);
|
||||
let is_future = tcx.ty_is_opaque_future(ty);
|
||||
debug!(
|
||||
?obligated_types,
|
||||
?is_future,
|
||||
"note_obligation_cause_code: check for async fn"
|
||||
);
|
||||
if opaque_ty_is_future(def_id)
|
||||
if is_future
|
||||
&& obligated_types.last().map_or(false, |ty| match ty.kind() {
|
||||
ty::Opaque(last_def_id, _) => {
|
||||
tcx.parent(*last_def_id) == from_generator
|
||||
|
|
@ -2475,15 +2461,11 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
}
|
||||
err.note(msg.trim_end_matches(", "))
|
||||
}
|
||||
ty::Generator(def_id, _, movability) => {
|
||||
ty::Generator(def_id, _, _) => {
|
||||
let sp = self.tcx.def_span(def_id);
|
||||
|
||||
// Special-case this to say "async block" instead of `[static generator]`.
|
||||
let kind = if *movability == Movability::Static {
|
||||
"async block"
|
||||
} else {
|
||||
"generator"
|
||||
};
|
||||
let kind = tcx.generator_kind(def_id).unwrap();
|
||||
err.span_note(
|
||||
sp,
|
||||
&format!("required because it's used within this {}", kind),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue