More precisely detect cycle errors from type_of on opaque
This commit is contained in:
parent
e7b3c94b0e
commit
bf53598828
@ -56,6 +56,7 @@ pub fn provide(providers: &mut Providers) {
|
||||
resolve_bound_vars::provide(providers);
|
||||
*providers = Providers {
|
||||
type_of: type_of::type_of,
|
||||
type_of_opaque: type_of::type_of_opaque,
|
||||
item_bounds: item_bounds::item_bounds,
|
||||
explicit_item_bounds: item_bounds::explicit_item_bounds,
|
||||
generics_of: generics_of::generics_of,
|
||||
|
@ -1,7 +1,8 @@
|
||||
use rustc_errors::{Applicability, StashKey};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::HirId;
|
||||
use rustc_middle::query::plumbing::CyclePlaceholder;
|
||||
use rustc_middle::ty::print::with_forced_trimmed_paths;
|
||||
use rustc_middle::ty::util::IntTypeExt;
|
||||
use rustc_middle::ty::{self, ImplTraitInTraitData, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
|
||||
@ -388,86 +389,62 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||
}
|
||||
},
|
||||
|
||||
Node::Item(item) => {
|
||||
match item.kind {
|
||||
ItemKind::Static(ty, .., body_id) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
infer_placeholder_type(
|
||||
tcx,
|
||||
def_id,
|
||||
body_id,
|
||||
ty.span,
|
||||
item.ident,
|
||||
"static variable",
|
||||
)
|
||||
} else {
|
||||
icx.to_ty(ty)
|
||||
}
|
||||
}
|
||||
ItemKind::Const(ty, _, body_id) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
infer_placeholder_type(
|
||||
tcx, def_id, body_id, ty.span, item.ident, "constant",
|
||||
)
|
||||
} else {
|
||||
icx.to_ty(ty)
|
||||
}
|
||||
}
|
||||
ItemKind::TyAlias(self_ty, _) => icx.to_ty(self_ty),
|
||||
ItemKind::Impl(hir::Impl { self_ty, .. }) => match self_ty.find_self_aliases() {
|
||||
spans if spans.len() > 0 => {
|
||||
let guar = tcx.sess.emit_err(crate::errors::SelfInImplSelf {
|
||||
span: spans.into(),
|
||||
note: (),
|
||||
});
|
||||
Ty::new_error(tcx, guar)
|
||||
}
|
||||
_ => icx.to_ty(*self_ty),
|
||||
},
|
||||
ItemKind::Fn(..) => {
|
||||
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
||||
Ty::new_fn_def(tcx, def_id.to_def_id(), args)
|
||||
}
|
||||
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) => {
|
||||
let def = tcx.adt_def(def_id);
|
||||
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
||||
Ty::new_adt(tcx, def, args)
|
||||
}
|
||||
ItemKind::OpaqueTy(OpaqueTy {
|
||||
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
||||
..
|
||||
}) => opaque::find_opaque_ty_constraints_for_tait(tcx, def_id),
|
||||
// Opaque types desugared from `impl Trait`.
|
||||
ItemKind::OpaqueTy(&OpaqueTy {
|
||||
origin:
|
||||
hir::OpaqueTyOrigin::FnReturn(owner) | hir::OpaqueTyOrigin::AsyncFn(owner),
|
||||
in_trait,
|
||||
..
|
||||
}) => {
|
||||
if in_trait && !tcx.defaultness(owner).has_value() {
|
||||
span_bug!(
|
||||
tcx.def_span(def_id),
|
||||
"tried to get type of this RPITIT with no definition"
|
||||
);
|
||||
}
|
||||
opaque::find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
||||
}
|
||||
ItemKind::Trait(..)
|
||||
| ItemKind::TraitAlias(..)
|
||||
| ItemKind::Macro(..)
|
||||
| ItemKind::Mod(..)
|
||||
| ItemKind::ForeignMod { .. }
|
||||
| ItemKind::GlobalAsm(..)
|
||||
| ItemKind::ExternCrate(..)
|
||||
| ItemKind::Use(..) => {
|
||||
span_bug!(
|
||||
item.span,
|
||||
"compute_type_of_item: unexpected item type: {:?}",
|
||||
item.kind
|
||||
);
|
||||
Node::Item(item) => match item.kind {
|
||||
ItemKind::Static(ty, .., body_id) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
infer_placeholder_type(
|
||||
tcx,
|
||||
def_id,
|
||||
body_id,
|
||||
ty.span,
|
||||
item.ident,
|
||||
"static variable",
|
||||
)
|
||||
} else {
|
||||
icx.to_ty(ty)
|
||||
}
|
||||
}
|
||||
}
|
||||
ItemKind::Const(ty, _, body_id) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
infer_placeholder_type(tcx, def_id, body_id, ty.span, item.ident, "constant")
|
||||
} else {
|
||||
icx.to_ty(ty)
|
||||
}
|
||||
}
|
||||
ItemKind::TyAlias(self_ty, _) => icx.to_ty(self_ty),
|
||||
ItemKind::Impl(hir::Impl { self_ty, .. }) => match self_ty.find_self_aliases() {
|
||||
spans if spans.len() > 0 => {
|
||||
let guar = tcx
|
||||
.sess
|
||||
.emit_err(crate::errors::SelfInImplSelf { span: spans.into(), note: () });
|
||||
Ty::new_error(tcx, guar)
|
||||
}
|
||||
_ => icx.to_ty(*self_ty),
|
||||
},
|
||||
ItemKind::Fn(..) => {
|
||||
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
||||
Ty::new_fn_def(tcx, def_id.to_def_id(), args)
|
||||
}
|
||||
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) => {
|
||||
let def = tcx.adt_def(def_id);
|
||||
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
||||
Ty::new_adt(tcx, def, args)
|
||||
}
|
||||
ItemKind::OpaqueTy(..) => tcx.type_of_opaque(def_id).map_or_else(
|
||||
|CyclePlaceholder(guar)| Ty::new_error(tcx, guar),
|
||||
|ty| ty.instantiate_identity(),
|
||||
),
|
||||
ItemKind::Trait(..)
|
||||
| ItemKind::TraitAlias(..)
|
||||
| ItemKind::Macro(..)
|
||||
| ItemKind::Mod(..)
|
||||
| ItemKind::ForeignMod { .. }
|
||||
| ItemKind::GlobalAsm(..)
|
||||
| ItemKind::ExternCrate(..)
|
||||
| ItemKind::Use(..) => {
|
||||
span_bug!(item.span, "compute_type_of_item: unexpected item type: {:?}", item.kind);
|
||||
}
|
||||
},
|
||||
|
||||
Node::ForeignItem(foreign_item) => match foreign_item.kind {
|
||||
ForeignItemKind::Fn(..) => {
|
||||
@ -514,6 +491,51 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||
ty::EarlyBinder::bind(output)
|
||||
}
|
||||
|
||||
pub(super) fn type_of_opaque(
|
||||
tcx: TyCtxt<'_>,
|
||||
def_id: DefId,
|
||||
) -> Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||
if let Some(def_id) = def_id.as_local() {
|
||||
use rustc_hir::*;
|
||||
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
Ok(ty::EarlyBinder::bind(match tcx.hir().get(hir_id) {
|
||||
Node::Item(item) => match item.kind {
|
||||
ItemKind::OpaqueTy(OpaqueTy {
|
||||
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
||||
..
|
||||
}) => opaque::find_opaque_ty_constraints_for_tait(tcx, def_id),
|
||||
// Opaque types desugared from `impl Trait`.
|
||||
ItemKind::OpaqueTy(&OpaqueTy {
|
||||
origin:
|
||||
hir::OpaqueTyOrigin::FnReturn(owner) | hir::OpaqueTyOrigin::AsyncFn(owner),
|
||||
in_trait,
|
||||
..
|
||||
}) => {
|
||||
if in_trait && !tcx.defaultness(owner).has_value() {
|
||||
span_bug!(
|
||||
tcx.def_span(def_id),
|
||||
"tried to get type of this RPITIT with no definition"
|
||||
);
|
||||
}
|
||||
opaque::find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
||||
}
|
||||
_ => {
|
||||
span_bug!(item.span, "type_of_opaque: unexpected item type: {:?}", item.kind);
|
||||
}
|
||||
},
|
||||
|
||||
x => {
|
||||
bug!("unexpected sort of node in type_of_opaque(): {:?}", x);
|
||||
}
|
||||
}))
|
||||
} else {
|
||||
// Foreign opaque type will go through the foreign provider
|
||||
// and load the type from metadata.
|
||||
Ok(tcx.type_of(def_id))
|
||||
}
|
||||
}
|
||||
|
||||
fn infer_placeholder_type<'a>(
|
||||
tcx: TyCtxt<'a>,
|
||||
def_id: LocalDefId,
|
||||
|
@ -1,4 +1,5 @@
|
||||
use crate::mir;
|
||||
use crate::query::CyclePlaceholder;
|
||||
use crate::traits;
|
||||
use crate::ty::{self, Ty};
|
||||
use std::mem::{size_of, transmute_copy, MaybeUninit};
|
||||
@ -142,6 +143,10 @@ impl EraseType for Result<&'_ ty::List<Ty<'_>>, ty::util::AlwaysRequiresDrop> {
|
||||
[u8; size_of::<Result<&'static ty::List<Ty<'static>>, ty::util::AlwaysRequiresDrop>>()];
|
||||
}
|
||||
|
||||
impl EraseType for Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||
type Result = [u8; size_of::<Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder>>()];
|
||||
}
|
||||
|
||||
impl<T> EraseType for Option<&'_ T> {
|
||||
type Result = [u8; size_of::<Option<&'static ()>>()];
|
||||
}
|
||||
|
@ -26,7 +26,7 @@
|
||||
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
||||
use crate::mir::mono::CodegenUnit;
|
||||
use crate::query::erase::{erase, restore, Erase};
|
||||
use crate::query::plumbing::{query_ensure, query_get_at, DynamicQuery};
|
||||
use crate::query::plumbing::{query_ensure, query_get_at, CyclePlaceholder, DynamicQuery};
|
||||
use crate::thir;
|
||||
use crate::traits::query::{
|
||||
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
||||
@ -243,6 +243,16 @@
|
||||
feedable
|
||||
}
|
||||
|
||||
/// Specialized instance of `type_of` that detects cycles that are due to
|
||||
/// revealing opaque because of an auto trait bound. Unless `CyclePlaceholder` needs
|
||||
/// to be handled separately, call `type_of` instead.
|
||||
query type_of_opaque(key: DefId) -> Result<ty::EarlyBinder<Ty<'tcx>>, CyclePlaceholder> {
|
||||
desc { |tcx|
|
||||
"computing type of opaque `{path}`",
|
||||
path = tcx.def_path_str(key),
|
||||
}
|
||||
}
|
||||
|
||||
query collect_return_position_impl_trait_in_trait_tys(key: DefId)
|
||||
-> Result<&'tcx FxHashMap<DefId, ty::EarlyBinder<Ty<'tcx>>>, ErrorGuaranteed>
|
||||
{
|
||||
|
@ -630,3 +630,6 @@ pub fn def_kind(self, def_id: impl IntoQueryParam<DefId>) -> DefKind {
|
||||
.unwrap_or_else(|| bug!("def_kind: unsupported node: {:?}", def_id))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, HashStable)]
|
||||
pub struct CyclePlaceholder(pub ErrorGuaranteed);
|
||||
|
@ -1,4 +1,5 @@
|
||||
use crate::dep_graph::DepKind;
|
||||
use crate::query::plumbing::CyclePlaceholder;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||
use rustc_hir as hir;
|
||||
@ -24,6 +25,16 @@ fn from_cycle_error(
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||
fn from_cycle_error(
|
||||
_tcx: TyCtxt<'tcx>,
|
||||
_: &[QueryInfo<DepKind>],
|
||||
guar: ErrorGuaranteed,
|
||||
) -> Self {
|
||||
Err(CyclePlaceholder(guar))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::SymbolName<'_> {
|
||||
fn from_cycle_error(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
|
@ -2346,14 +2346,15 @@ fn constituent_types_for_ty(
|
||||
}
|
||||
|
||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => {
|
||||
let ty = self.tcx().type_of(def_id);
|
||||
if ty.skip_binder().references_error() {
|
||||
return Err(SelectionError::OpaqueTypeAutoTraitLeakageUnknown(def_id));
|
||||
}
|
||||
// We can resolve the `impl Trait` to its concrete type,
|
||||
// which enforces a DAG between the functions requiring
|
||||
// the auto trait bounds in question.
|
||||
t.rebind(vec![ty.instantiate(self.tcx(), args)])
|
||||
match self.tcx().type_of_opaque(def_id) {
|
||||
Ok(ty) => t.rebind(vec![ty.instantiate(self.tcx(), args)]),
|
||||
Err(_) => {
|
||||
return Err(SelectionError::OpaqueTypeAutoTraitLeakageUnknown(def_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
17
tests/ui/async-await/future-contains-err-issue-115188.rs
Normal file
17
tests/ui/async-await/future-contains-err-issue-115188.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// edition: 2021
|
||||
|
||||
// Makes sure we don't spew a bunch of unrelated opaque errors when the reason
|
||||
// for this error is just a missing struct field in `foo`.
|
||||
|
||||
async fn foo() {
|
||||
let y = Wrapper { };
|
||||
//~^ ERROR missing field `t` in initializer of `Wrapper<_>`
|
||||
}
|
||||
|
||||
struct Wrapper<T> { t: T }
|
||||
|
||||
fn is_send<T: Send>(_: T) {}
|
||||
|
||||
fn main() {
|
||||
is_send(foo());
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
error[E0063]: missing field `t` in initializer of `Wrapper<_>`
|
||||
--> $DIR/future-contains-err-issue-115188.rs:7:13
|
||||
|
|
||||
LL | let y = Wrapper { };
|
||||
| ^^^^^^^ missing `t`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0063`.
|
@ -24,6 +24,5 @@ async fn cb() {
|
||||
type F = impl Future;
|
||||
// Check that statics are inhabited computes they layout.
|
||||
static POOL: Task<F> = Task::new();
|
||||
//~^ ERROR: cannot check whether the hidden type of `layout_error[b009]::main::F::{opaque#0}` satisfies auto traits
|
||||
Task::spawn(&POOL, || cb());
|
||||
}
|
||||
|
@ -4,24 +4,6 @@ error[E0425]: cannot find value `Foo` in this scope
|
||||
LL | let a = Foo;
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: cannot check whether the hidden type of `layout_error[b009]::main::F::{opaque#0}` satisfies auto traits
|
||||
--> $DIR/layout-error.rs:26:18
|
||||
|
|
||||
LL | static POOL: Task<F> = Task::new();
|
||||
| ^^^^^^^
|
||||
|
|
||||
note: opaque type is declared here
|
||||
--> $DIR/layout-error.rs:24:14
|
||||
|
|
||||
LL | type F = impl Future;
|
||||
| ^^^^^^^^^^^
|
||||
note: required because it appears within the type `Task<F>`
|
||||
--> $DIR/layout-error.rs:9:12
|
||||
|
|
||||
LL | pub struct Task<F: Future>(F);
|
||||
| ^^^^
|
||||
= note: shared static variables must have a type that implements `Sync`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
||||
|
@ -12,7 +12,6 @@ fn cycle1() -> impl Clone {
|
||||
//~^ ERROR cycle detected
|
||||
//~| ERROR cycle detected
|
||||
send(cycle2().clone());
|
||||
//~^ ERROR: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
|
||||
Rc::new(Cell::new(5))
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0391]: cycle detected when computing type of `cycle1::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `cycle1::{opaque#0}`
|
||||
--> $DIR/auto-trait-leak.rs:11:16
|
||||
|
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
@ -10,32 +10,26 @@ note: ...which requires type-checking `cycle1`...
|
||||
LL | send(cycle2().clone());
|
||||
| ^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `cycle2::{opaque#0}: core::marker::Send`...
|
||||
note: ...which requires computing type of `cycle2::{opaque#0}`...
|
||||
--> $DIR/auto-trait-leak.rs:20:16
|
||||
note: ...which requires computing type of opaque `cycle2::{opaque#0}`...
|
||||
--> $DIR/auto-trait-leak.rs:19:16
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
note: ...which requires type-checking `cycle2`...
|
||||
--> $DIR/auto-trait-leak.rs:21:5
|
||||
--> $DIR/auto-trait-leak.rs:20:5
|
||||
|
|
||||
LL | send(cycle1().clone());
|
||||
| ^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `cycle1::{opaque#0}: core::marker::Send`...
|
||||
= note: ...which again requires computing type of `cycle1::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in top-level module
|
||||
--> $DIR/auto-trait-leak.rs:1:1
|
||||
= note: ...which again requires computing type of opaque `cycle1::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `cycle1::{opaque#0}`
|
||||
--> $DIR/auto-trait-leak.rs:11:16
|
||||
|
|
||||
LL | / use std::cell::Cell;
|
||||
LL | | use std::rc::Rc;
|
||||
LL | |
|
||||
LL | | fn send<T: Send>(_: T) {}
|
||||
... |
|
||||
LL | | Rc::new(String::from("foo"))
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error[E0391]: cycle detected when computing type of `cycle1::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `cycle1::{opaque#0}`
|
||||
--> $DIR/auto-trait-leak.rs:11:16
|
||||
|
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
@ -47,32 +41,26 @@ note: ...which requires type-checking `cycle1`...
|
||||
LL | send(cycle2().clone());
|
||||
| ^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `cycle2::{opaque#0}: core::marker::Send`...
|
||||
note: ...which requires computing type of `cycle2::{opaque#0}`...
|
||||
--> $DIR/auto-trait-leak.rs:20:16
|
||||
note: ...which requires computing type of opaque `cycle2::{opaque#0}`...
|
||||
--> $DIR/auto-trait-leak.rs:19:16
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
note: ...which requires type-checking `cycle2`...
|
||||
--> $DIR/auto-trait-leak.rs:20:1
|
||||
--> $DIR/auto-trait-leak.rs:19:1
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires computing type of `cycle1::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in top-level module
|
||||
--> $DIR/auto-trait-leak.rs:1:1
|
||||
= note: ...which again requires computing type of opaque `cycle1::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `cycle1::{opaque#0}`
|
||||
--> $DIR/auto-trait-leak.rs:11:16
|
||||
|
|
||||
LL | / use std::cell::Cell;
|
||||
LL | | use std::rc::Rc;
|
||||
LL | |
|
||||
LL | | fn send<T: Send>(_: T) {}
|
||||
... |
|
||||
LL | | Rc::new(String::from("foo"))
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
--> $DIR/auto-trait-leak.rs:21:10
|
||||
--> $DIR/auto-trait-leak.rs:20:10
|
||||
|
|
||||
LL | send(cycle1().clone());
|
||||
| ---- ^^^^^^^^^^^^^^^^
|
||||
@ -85,7 +73,7 @@ note: opaque type is declared here
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
note: this item depends on auto traits of the hidden type, but may also be registering the hidden type. This is not supported right now. You can try moving the opaque type and the item that actually registers a hidden type into a new submodule
|
||||
--> $DIR/auto-trait-leak.rs:20:4
|
||||
--> $DIR/auto-trait-leak.rs:19:4
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^
|
||||
@ -95,30 +83,6 @@ note: required by a bound in `send`
|
||||
LL | fn send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `send`
|
||||
|
||||
error: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
--> $DIR/auto-trait-leak.rs:14:10
|
||||
|
|
||||
LL | send(cycle2().clone());
|
||||
| ---- ^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: opaque type is declared here
|
||||
--> $DIR/auto-trait-leak.rs:20:16
|
||||
|
|
||||
LL | fn cycle2() -> impl Clone {
|
||||
| ^^^^^^^^^^
|
||||
note: this item depends on auto traits of the hidden type, but may also be registering the hidden type. This is not supported right now. You can try moving the opaque type and the item that actually registers a hidden type into a new submodule
|
||||
--> $DIR/auto-trait-leak.rs:11:4
|
||||
|
|
||||
LL | fn cycle1() -> impl Clone {
|
||||
| ^^^^^^
|
||||
note: required by a bound in `send`
|
||||
--> $DIR/auto-trait-leak.rs:4:12
|
||||
|
|
||||
LL | fn send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `send`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0391`.
|
||||
|
@ -24,8 +24,6 @@ async fn iceice<A, B>()
|
||||
B: Send, // <- a second bound
|
||||
{
|
||||
normalize(broken_fut(), ());
|
||||
//~^ ERROR: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
//~| ERROR: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -4,61 +4,6 @@ error[E0425]: cannot find value `ident_error` in this scope
|
||||
LL | ident_error;
|
||||
| ^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
--> $DIR/issue-103181-2.rs:26:15
|
||||
|
|
||||
LL | normalize(broken_fut(), ());
|
||||
| --------- ^^^^^^^^^^^^
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: opaque type is declared here
|
||||
--> $DIR/issue-103181-2.rs:11:23
|
||||
|
|
||||
LL | async fn broken_fut() {
|
||||
| ^
|
||||
note: this item depends on auto traits of the hidden type, but may also be registering the hidden type. This is not supported right now. You can try moving the opaque type and the item that actually registers a hidden type into a new submodule
|
||||
--> $DIR/issue-103181-2.rs:20:10
|
||||
|
|
||||
LL | async fn iceice<A, B>()
|
||||
| ^^^^^^
|
||||
note: required for `impl Future<Output = ()>` to implement `SendFuture`
|
||||
--> $DIR/issue-103181-2.rs:7:17
|
||||
|
|
||||
LL | impl<Fut: Send> SendFuture for Fut {
|
||||
| ---- ^^^^^^^^^^ ^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
note: required by a bound in `normalize`
|
||||
--> $DIR/issue-103181-2.rs:18:19
|
||||
|
|
||||
LL | fn normalize<Fut: SendFuture>(_: Fut, _: Fut::Output) {}
|
||||
| ^^^^^^^^^^ required by this bound in `normalize`
|
||||
|
||||
error: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
--> $DIR/issue-103181-2.rs:26:5
|
||||
|
|
||||
LL | normalize(broken_fut(), ());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: opaque type is declared here
|
||||
--> $DIR/issue-103181-2.rs:11:23
|
||||
|
|
||||
LL | async fn broken_fut() {
|
||||
| ^
|
||||
note: this item depends on auto traits of the hidden type, but may also be registering the hidden type. This is not supported right now. You can try moving the opaque type and the item that actually registers a hidden type into a new submodule
|
||||
--> $DIR/issue-103181-2.rs:20:10
|
||||
|
|
||||
LL | async fn iceice<A, B>()
|
||||
| ^^^^^^
|
||||
note: required for `impl Future<Output = ()>` to implement `SendFuture`
|
||||
--> $DIR/issue-103181-2.rs:7:17
|
||||
|
|
||||
LL | impl<Fut: Send> SendFuture for Fut {
|
||||
| ---- ^^^^^^^^^^ ^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
||||
|
@ -7,6 +7,6 @@ LL | type TransactionFuture<'__, O> = impl '__ + Future<Output = TransactionResu
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
query stack during panic:
|
||||
#0 [type_of] computing type of `TransactionFuture::{opaque#0}`
|
||||
#1 [check_mod_item_types] checking item types in top-level module
|
||||
#0 [type_of_opaque] computing type of opaque `TransactionFuture::{opaque#0}`
|
||||
#1 [type_of] computing type of `TransactionFuture::{opaque#0}`
|
||||
end of query stack
|
||||
|
@ -5,8 +5,8 @@
|
||||
|
||||
mod m {
|
||||
pub type Foo = impl std::fmt::Debug;
|
||||
//~^ ERROR: cycle detected when computing type of `m::Foo::{opaque#0}` [E0391]
|
||||
//~| ERROR: cycle detected when computing type of `m::Foo::{opaque#0}` [E0391]
|
||||
//~^ ERROR: cycle detected when computing type of opaque `m::Foo::{opaque#0}` [E0391]
|
||||
//~| ERROR: cycle detected when computing type of opaque `m::Foo::{opaque#0}` [E0391]
|
||||
|
||||
pub fn foo() -> Foo {
|
||||
22_u32
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0391]: cycle detected when computing type of `m::Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `m::Foo::{opaque#0}`
|
||||
--> $DIR/auto-trait-leakage3.rs:7:20
|
||||
|
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
@ -10,15 +10,15 @@ note: ...which requires type-checking `m::bar`...
|
||||
LL | is_send(foo());
|
||||
| ^^^^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `m::Foo: core::marker::Send`...
|
||||
= note: ...which again requires computing type of `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in module `m`
|
||||
--> $DIR/auto-trait-leakage3.rs:6:1
|
||||
= note: ...which again requires computing type of opaque `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `m::Foo::{opaque#0}`
|
||||
--> $DIR/auto-trait-leakage3.rs:7:20
|
||||
|
|
||||
LL | mod m {
|
||||
| ^^^^^
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error[E0391]: cycle detected when computing type of `m::Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `m::Foo::{opaque#0}`
|
||||
--> $DIR/auto-trait-leakage3.rs:7:20
|
||||
|
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
@ -29,12 +29,12 @@ note: ...which requires type-checking `m::bar`...
|
||||
|
|
||||
LL | pub fn bar() {
|
||||
| ^^^^^^^^^^^^
|
||||
= note: ...which again requires computing type of `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in module `m`
|
||||
--> $DIR/auto-trait-leakage3.rs:6:1
|
||||
= note: ...which again requires computing type of opaque `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `m::Foo::{opaque#0}`
|
||||
--> $DIR/auto-trait-leakage3.rs:7:20
|
||||
|
|
||||
LL | mod m {
|
||||
| ^^^^^
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error: cannot check whether the hidden type of `auto_trait_leakage3[211d]::m::Foo::{opaque#0}` satisfies auto traits
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0391]: cycle detected when computing type of `m::Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `m::Foo::{opaque#0}`
|
||||
--> $DIR/inference-cycle.rs:5:20
|
||||
|
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
@ -10,15 +10,15 @@ note: ...which requires type-checking `m::bar`...
|
||||
LL | is_send(foo()); // Today: error
|
||||
| ^^^^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `m::Foo: core::marker::Send`...
|
||||
= note: ...which again requires computing type of `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in module `m`
|
||||
--> $DIR/inference-cycle.rs:4:1
|
||||
= note: ...which again requires computing type of opaque `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `m::Foo::{opaque#0}`
|
||||
--> $DIR/inference-cycle.rs:5:20
|
||||
|
|
||||
LL | mod m {
|
||||
| ^^^^^
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error[E0391]: cycle detected when computing type of `m::Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `m::Foo::{opaque#0}`
|
||||
--> $DIR/inference-cycle.rs:5:20
|
||||
|
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
@ -29,12 +29,12 @@ note: ...which requires type-checking `m::bar`...
|
||||
|
|
||||
LL | pub fn bar() {
|
||||
| ^^^^^^^^^^^^
|
||||
= note: ...which again requires computing type of `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in module `m`
|
||||
--> $DIR/inference-cycle.rs:4:1
|
||||
= note: ...which again requires computing type of opaque `m::Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `m::Foo::{opaque#0}`
|
||||
--> $DIR/inference-cycle.rs:5:20
|
||||
|
|
||||
LL | mod m {
|
||||
| ^^^^^
|
||||
LL | pub type Foo = impl std::fmt::Debug;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error: cannot check whether the hidden type of `inference_cycle[4ecc]::m::Foo::{opaque#0}` satisfies auto traits
|
||||
|
@ -4,6 +4,11 @@ error[E0391]: cycle detected when computing type of `Bug::{opaque#0}`
|
||||
LL | type Bug<T, U> = impl Fn(T) -> U + Copy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires computing type of opaque `Bug::{opaque#0}`...
|
||||
--> $DIR/issue-53092-2.rs:4:18
|
||||
|
|
||||
LL | type Bug<T, U> = impl Fn(T) -> U + Copy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires type-checking `CONST_BUG`...
|
||||
--> $DIR/issue-53092-2.rs:6:1
|
||||
|
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0391]: cycle detected when computing type of `Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | type Foo = impl Debug;
|
||||
@ -10,21 +10,15 @@ note: ...which requires type-checking `not_good`...
|
||||
LL | is_send::<Foo>();
|
||||
| ^^^^^^^^^^^^^^
|
||||
= note: ...which requires evaluating trait selection obligation `Foo: core::marker::Send`...
|
||||
= note: ...which again requires computing type of `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in top-level module
|
||||
--> $DIR/reveal_local.rs:1:1
|
||||
= note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | / #![feature(type_alias_impl_trait)]
|
||||
LL | |
|
||||
LL | | use std::fmt::Debug;
|
||||
LL | |
|
||||
... |
|
||||
LL | |
|
||||
LL | | fn main() {}
|
||||
| |____________^
|
||||
LL | type Foo = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error[E0391]: cycle detected when computing type of `Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | type Foo = impl Debug;
|
||||
@ -35,18 +29,12 @@ note: ...which requires type-checking `not_good`...
|
||||
|
|
||||
LL | fn not_good() {
|
||||
| ^^^^^^^^^^^^^
|
||||
= note: ...which again requires computing type of `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in top-level module
|
||||
--> $DIR/reveal_local.rs:1:1
|
||||
= note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | / #![feature(type_alias_impl_trait)]
|
||||
LL | |
|
||||
LL | | use std::fmt::Debug;
|
||||
LL | |
|
||||
... |
|
||||
LL | |
|
||||
LL | | fn main() {}
|
||||
| |____________^
|
||||
LL | type Foo = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error: cannot check whether the hidden type of `reveal_local[9507]::Foo::{opaque#0}` satisfies auto traits
|
||||
@ -71,7 +59,7 @@ note: required by a bound in `is_send`
|
||||
LL | fn is_send<T: Send>() {}
|
||||
| ^^^^ required by this bound in `is_send`
|
||||
|
||||
error[E0391]: cycle detected when computing type of `Foo::{opaque#0}`
|
||||
error[E0391]: cycle detected when computing type of opaque `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | type Foo = impl Debug;
|
||||
@ -82,18 +70,12 @@ note: ...which requires type-checking `not_gooder`...
|
||||
|
|
||||
LL | fn not_gooder() -> Foo {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires computing type of `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when checking item types in top-level module
|
||||
--> $DIR/reveal_local.rs:1:1
|
||||
= note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle
|
||||
note: cycle used when computing type of `Foo::{opaque#0}`
|
||||
--> $DIR/reveal_local.rs:5:12
|
||||
|
|
||||
LL | / #![feature(type_alias_impl_trait)]
|
||||
LL | |
|
||||
LL | | use std::fmt::Debug;
|
||||
LL | |
|
||||
... |
|
||||
LL | |
|
||||
LL | | fn main() {}
|
||||
| |____________^
|
||||
LL | type Foo = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error: cannot check whether the hidden type of `reveal_local[9507]::Foo::{opaque#0}` satisfies auto traits
|
||||
|
Loading…
Reference in New Issue
Block a user