Do not try to reveal hidden types when trying to prove Freeze in the defining scope
This commit is contained in:
parent
fdff100545
commit
acba6449f8
18 changed files with 67 additions and 261 deletions
|
@ -100,7 +100,33 @@ impl Qualif for HasMutInterior {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn in_any_value_of_ty<'tcx>(cx: &ConstCx<'_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
fn in_any_value_of_ty<'tcx>(cx: &ConstCx<'_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
||||||
!ty.is_freeze(cx.tcx, cx.param_env)
|
// Avoid selecting for simple cases, such as builtin types.
|
||||||
|
if ty.is_trivially_freeze() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do not use `ty.is_freeze` here, because that requires revealing opaque types, which
|
||||||
|
// requires borrowck, which in turn will invoke mir_const_qualifs again, causing a cycle error.
|
||||||
|
// Instead we invoke an obligation context manually, and provide the opaque type inference settings
|
||||||
|
// that allow the trait solver to just error out instead of cycling.
|
||||||
|
let freeze_def_id = cx.tcx.require_lang_item(LangItem::Freeze, Some(cx.body.span));
|
||||||
|
|
||||||
|
let obligation = Obligation::new(
|
||||||
|
cx.tcx,
|
||||||
|
ObligationCause::dummy_with_span(cx.body.span),
|
||||||
|
cx.param_env,
|
||||||
|
ty::TraitRef::new(cx.tcx, freeze_def_id, [ty::GenericArg::from(ty)]),
|
||||||
|
);
|
||||||
|
|
||||||
|
let infcx = cx
|
||||||
|
.tcx
|
||||||
|
.infer_ctxt()
|
||||||
|
.with_opaque_type_inference(cx.body.source.def_id().expect_local())
|
||||||
|
.build();
|
||||||
|
let ocx = ObligationCtxt::new(&infcx);
|
||||||
|
ocx.register_obligation(obligation);
|
||||||
|
let errors = ocx.select_all_or_error();
|
||||||
|
!errors.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn in_adt_inherently<'tcx>(
|
fn in_adt_inherently<'tcx>(
|
||||||
|
|
|
@ -1268,7 +1268,7 @@ impl<'tcx> Ty<'tcx> {
|
||||||
///
|
///
|
||||||
/// Returning true means the type is known to be `Freeze`. Returning
|
/// Returning true means the type is known to be `Freeze`. Returning
|
||||||
/// `false` means nothing -- could be `Freeze`, might not be.
|
/// `false` means nothing -- could be `Freeze`, might not be.
|
||||||
fn is_trivially_freeze(self) -> bool {
|
pub fn is_trivially_freeze(self) -> bool {
|
||||||
match self.kind() {
|
match self.kind() {
|
||||||
ty::Int(_)
|
ty::Int(_)
|
||||||
| ty::Uint(_)
|
| ty::Uint(_)
|
||||||
|
|
|
@ -2386,13 +2386,17 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => {
|
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => {
|
||||||
// We can resolve the `impl Trait` to its concrete type,
|
if self.infcx.can_define_opaque_ty(def_id) {
|
||||||
// which enforces a DAG between the functions requiring
|
unreachable!()
|
||||||
// the auto trait bounds in question.
|
} else {
|
||||||
match self.tcx().type_of_opaque(def_id) {
|
// We can resolve the `impl Trait` to its concrete type,
|
||||||
Ok(ty) => t.rebind(vec![ty.instantiate(self.tcx(), args)]),
|
// which enforces a DAG between the functions requiring
|
||||||
Err(_) => {
|
// the auto trait bounds in question.
|
||||||
return Err(SelectionError::OpaqueTypeAutoTraitLeakageUnknown(def_id));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,8 +122,6 @@ note: ...which requires const checking `main::{constant#0}`...
|
||||||
|
|
|
|
||||||
LL | foo::<42>();
|
LL | foo::<42>();
|
||||||
| ^^
|
| ^^
|
||||||
= note: ...which requires computing whether `Foo` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `Foo: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle
|
= note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle
|
||||||
note: cycle used when computing type of `Foo::{opaque#0}`
|
note: cycle used when computing type of `Foo::{opaque#0}`
|
||||||
--> $DIR/opaque_types.rs:3:12
|
--> $DIR/opaque_types.rs:3:12
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
/// to end up revealing opaque types (the RPIT in `many`'s return type),
|
/// to end up revealing opaque types (the RPIT in `many`'s return type),
|
||||||
/// which can quickly lead to cycles.
|
/// which can quickly lead to cycles.
|
||||||
|
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
pub struct Parser<H>(H);
|
pub struct Parser<H>(H);
|
||||||
|
|
||||||
impl<H, T> Parser<H>
|
impl<H, T> Parser<H>
|
||||||
|
@ -18,7 +20,6 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
||||||
//~^ ERROR: cycle detected
|
|
||||||
Parser::new(|_| unimplemented!())
|
Parser::new(|_| unimplemented!())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
error[E0391]: cycle detected when computing type of opaque `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many::{opaque#0}`
|
|
||||||
--> $DIR/const-fn-cycle.rs:20:47
|
|
||||||
|
|
|
||||||
LL | pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires borrow-checking `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many`...
|
|
||||||
--> $DIR/const-fn-cycle.rs:20:5
|
|
||||||
|
|
|
||||||
LL | pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires promoting constants in MIR for `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many`...
|
|
||||||
--> $DIR/const-fn-cycle.rs:20:5
|
|
||||||
|
|
|
||||||
LL | pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires const checking `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many`...
|
|
||||||
--> $DIR/const-fn-cycle.rs:20:5
|
|
||||||
|
|
|
||||||
LL | pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: ...which requires computing whether `Parser<<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many::{opaque#0}>` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `Parser<<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many::{opaque#0}>: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `<impl at $DIR/const-fn-cycle.rs:12:1: 14:33>::many::{opaque#0}`
|
|
||||||
--> $DIR/const-fn-cycle.rs:20:47
|
|
||||||
|
|
|
||||||
LL | pub const fn many<'s>(&'s self) -> Parser<impl for<'a> Fn(&'a str) -> Vec<T> + 's> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= 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: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0391`.
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0658]: cannot borrow here, since the borrowed element may contain interior mutability
|
error[E0658]: cannot borrow here, since the borrowed element may contain interior mutability
|
||||||
--> $DIR/const-promoted-opaque.rs:29:25
|
--> $DIR/const-promoted-opaque.rs:28:25
|
||||||
|
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
LL | let _: &'static _ = &FOO;
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
@ -9,7 +9,7 @@ LL | let _: &'static _ = &FOO;
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0493]: destructor of `helper::Foo` cannot be evaluated at compile-time
|
error[E0493]: destructor of `helper::Foo` cannot be evaluated at compile-time
|
||||||
--> $DIR/const-promoted-opaque.rs:29:26
|
--> $DIR/const-promoted-opaque.rs:28:26
|
||||||
|
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
LL | let _: &'static _ = &FOO;
|
||||||
| ^^^ the destructor for this type cannot be evaluated in constants
|
| ^^^ the destructor for this type cannot be evaluated in constants
|
||||||
|
@ -18,13 +18,13 @@ LL | };
|
||||||
| - value is dropped here
|
| - value is dropped here
|
||||||
|
|
||||||
error[E0492]: constants cannot refer to interior mutable data
|
error[E0492]: constants cannot refer to interior mutable data
|
||||||
--> $DIR/const-promoted-opaque.rs:34:19
|
--> $DIR/const-promoted-opaque.rs:33:19
|
||||||
|
|
|
|
||||||
LL | const BAZ: &Foo = &FOO;
|
LL | const BAZ: &Foo = &FOO;
|
||||||
| ^^^^ this borrow of an interior mutable value may end up in the final value
|
| ^^^^ this borrow of an interior mutable value may end up in the final value
|
||||||
|
|
||||||
error[E0716]: temporary value dropped while borrowed
|
error[E0716]: temporary value dropped while borrowed
|
||||||
--> $DIR/const-promoted-opaque.rs:38:26
|
--> $DIR/const-promoted-opaque.rs:37:26
|
||||||
|
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
LL | let _: &'static _ = &FOO;
|
||||||
| ---------- ^^^ creates a temporary value which is freed while still in use
|
| ---------- ^^^ creates a temporary value which is freed while still in use
|
||||||
|
@ -34,38 +34,7 @@ LL |
|
||||||
LL | }
|
LL | }
|
||||||
| - temporary value is freed at the end of this statement
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing type of opaque `helper::Foo::{opaque#0}`
|
error: aborting due to 4 previous errors
|
||||||
--> $DIR/const-promoted-opaque.rs:14:20
|
|
||||||
|
|
|
||||||
LL | pub type Foo = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires borrow-checking `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:21:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = std::sync::atomic::AtomicU8::new(42);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires promoting constants in MIR for `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:21:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = std::sync::atomic::AtomicU8::new(42);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires const checking `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:21:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = std::sync::atomic::AtomicU8::new(42);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: ...which requires computing whether `helper::Foo` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `helper::Foo: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `helper::Foo::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `helper::Foo::{opaque#0}`
|
|
||||||
--> $DIR/const-promoted-opaque.rs:14:20
|
|
||||||
|
|
|
||||||
LL | pub type Foo = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
= 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: aborting due to 5 previous errors
|
Some errors have detailed explanations: E0492, E0493, E0658, E0716.
|
||||||
|
For more information about an error, try `rustc --explain E0492`.
|
||||||
Some errors have detailed explanations: E0391, E0492, E0493, E0658, E0716.
|
|
||||||
For more information about an error, try `rustc --explain E0391`.
|
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
|
|
||||||
mod helper {
|
mod helper {
|
||||||
pub type Foo = impl Sized;
|
pub type Foo = impl Sized;
|
||||||
//[string,atomic]~^ ERROR cycle detected
|
|
||||||
|
|
||||||
#[cfg(string)]
|
#[cfg(string)]
|
||||||
pub const FOO: Foo = String::new();
|
pub const FOO: Foo = String::new();
|
||||||
|
@ -28,11 +27,11 @@ use helper::*;
|
||||||
const BAR: () = {
|
const BAR: () = {
|
||||||
let _: &'static _ = &FOO;
|
let _: &'static _ = &FOO;
|
||||||
//[string,atomic]~^ ERROR: destructor of `helper::Foo` cannot be evaluated at compile-time
|
//[string,atomic]~^ ERROR: destructor of `helper::Foo` cannot be evaluated at compile-time
|
||||||
//[string,atomic]~| ERROR: cannot borrow here
|
//[atomic]~| ERROR: cannot borrow here
|
||||||
};
|
};
|
||||||
|
|
||||||
const BAZ: &Foo = &FOO;
|
const BAZ: &Foo = &FOO;
|
||||||
//[string,atomic]~^ ERROR: constants cannot refer to interior mutable data
|
//[atomic]~^ ERROR: constants cannot refer to interior mutable data
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _: &'static _ = &FOO;
|
let _: &'static _ = &FOO;
|
||||||
|
|
|
@ -1,15 +1,5 @@
|
||||||
error[E0658]: cannot borrow here, since the borrowed element may contain interior mutability
|
|
||||||
--> $DIR/const-promoted-opaque.rs:29:25
|
|
||||||
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
|
||||||
| ^^^^
|
|
||||||
|
|
|
||||||
= note: see issue #80384 <https://github.com/rust-lang/rust/issues/80384> for more information
|
|
||||||
= help: add `#![feature(const_refs_to_cell)]` to the crate attributes to enable
|
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
|
||||||
|
|
||||||
error[E0493]: destructor of `helper::Foo` cannot be evaluated at compile-time
|
error[E0493]: destructor of `helper::Foo` cannot be evaluated at compile-time
|
||||||
--> $DIR/const-promoted-opaque.rs:29:26
|
--> $DIR/const-promoted-opaque.rs:28:26
|
||||||
|
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
LL | let _: &'static _ = &FOO;
|
||||||
| ^^^ the destructor for this type cannot be evaluated in constants
|
| ^^^ the destructor for this type cannot be evaluated in constants
|
||||||
|
@ -17,14 +7,8 @@ LL | let _: &'static _ = &FOO;
|
||||||
LL | };
|
LL | };
|
||||||
| - value is dropped here
|
| - value is dropped here
|
||||||
|
|
||||||
error[E0492]: constants cannot refer to interior mutable data
|
|
||||||
--> $DIR/const-promoted-opaque.rs:34:19
|
|
||||||
|
|
|
||||||
LL | const BAZ: &Foo = &FOO;
|
|
||||||
| ^^^^ this borrow of an interior mutable value may end up in the final value
|
|
||||||
|
|
||||||
error[E0716]: temporary value dropped while borrowed
|
error[E0716]: temporary value dropped while borrowed
|
||||||
--> $DIR/const-promoted-opaque.rs:38:26
|
--> $DIR/const-promoted-opaque.rs:37:26
|
||||||
|
|
|
|
||||||
LL | let _: &'static _ = &FOO;
|
LL | let _: &'static _ = &FOO;
|
||||||
| ---------- ^^^ creates a temporary value which is freed while still in use
|
| ---------- ^^^ creates a temporary value which is freed while still in use
|
||||||
|
@ -34,38 +18,7 @@ LL |
|
||||||
LL | }
|
LL | }
|
||||||
| - temporary value is freed at the end of this statement
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing type of opaque `helper::Foo::{opaque#0}`
|
error: aborting due to 2 previous errors
|
||||||
--> $DIR/const-promoted-opaque.rs:14:20
|
|
||||||
|
|
|
||||||
LL | pub type Foo = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires borrow-checking `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:18:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = String::new();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires promoting constants in MIR for `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:18:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = String::new();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires const checking `helper::FOO`...
|
|
||||||
--> $DIR/const-promoted-opaque.rs:18:5
|
|
||||||
|
|
|
||||||
LL | pub const FOO: Foo = String::new();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: ...which requires computing whether `helper::Foo` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `helper::Foo: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `helper::Foo::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `helper::Foo::{opaque#0}`
|
|
||||||
--> $DIR/const-promoted-opaque.rs:14:20
|
|
||||||
|
|
|
||||||
LL | pub type Foo = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
= 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: aborting due to 5 previous errors
|
Some errors have detailed explanations: E0493, E0716.
|
||||||
|
For more information about an error, try `rustc --explain E0493`.
|
||||||
Some errors have detailed explanations: E0391, E0492, E0493, E0658, E0716.
|
|
||||||
For more information about an error, try `rustc --explain E0391`.
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0599]: no method named `my_debug` found for opaque type `impl Debug` in the current scope
|
error[E0599]: no method named `my_debug` found for opaque type `impl Debug` in the current scope
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:20:11
|
--> $DIR/call_method_on_inherent_impl_ref.rs:19:11
|
||||||
|
|
|
|
||||||
LL | fn my_debug(&self);
|
LL | fn my_debug(&self);
|
||||||
| -------- the method is available for `&impl Debug` here
|
| -------- the method is available for `&impl Debug` here
|
||||||
|
@ -14,27 +14,6 @@ note: `MyDebug` defines an item `my_debug`, perhaps you need to implement it
|
||||||
LL | trait MyDebug {
|
LL | trait MyDebug {
|
||||||
| ^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing type of opaque `my_foo::{opaque#0}`
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:15:16
|
|
||||||
|
|
|
||||||
LL | fn my_foo() -> impl std::fmt::Debug {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires type-checking `my_foo`...
|
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:20:9
|
|
||||||
|
|
|
||||||
LL | x.my_debug();
|
|
||||||
| ^
|
|
||||||
= note: ...which requires evaluating trait selection obligation `my_foo::{opaque#0}: core::marker::Unpin`...
|
|
||||||
= note: ...which again requires computing type of opaque `my_foo::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `my_foo::{opaque#0}`
|
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:15:16
|
|
||||||
|
|
|
||||||
LL | fn my_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: aborting due to 2 previous errors
|
For more information about this error, try `rustc --explain E0599`.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0391, E0599.
|
|
||||||
For more information about an error, try `rustc --explain E0391`.
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:18:13
|
--> $DIR/call_method_on_inherent_impl_ref.rs:17:13
|
||||||
|
|
|
|
||||||
LL | let x = my_foo();
|
LL | let x = my_foo();
|
||||||
| ^
|
| ^
|
||||||
|
@ -13,7 +13,7 @@ LL | let x: /* Type */ = my_foo();
|
||||||
| ++++++++++++
|
| ++++++++++++
|
||||||
|
|
||||||
error[E0282]: type annotations needed for `&_`
|
error[E0282]: type annotations needed for `&_`
|
||||||
--> $DIR/call_method_on_inherent_impl_ref.rs:28:13
|
--> $DIR/call_method_on_inherent_impl_ref.rs:27:13
|
||||||
|
|
|
|
||||||
LL | let x = &my_bar();
|
LL | let x = &my_bar();
|
||||||
| ^
|
| ^
|
||||||
|
|
|
@ -13,7 +13,6 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn my_foo() -> impl std::fmt::Debug {
|
fn my_foo() -> impl std::fmt::Debug {
|
||||||
//[current]~^ cycle
|
|
||||||
if false {
|
if false {
|
||||||
let x = my_foo();
|
let x = my_foo();
|
||||||
//[next]~^ type annotations needed
|
//[next]~^ type annotations needed
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
error[E0391]: cycle detected when computing type of opaque `f::{opaque#0}`
|
|
||||||
--> $DIR/const_check_false_cycle.rs:9:17
|
|
||||||
|
|
|
||||||
LL | const fn f() -> impl Eq {
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires borrow-checking `f`...
|
|
||||||
--> $DIR/const_check_false_cycle.rs:9:1
|
|
||||||
|
|
|
||||||
LL | const fn f() -> impl Eq {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires promoting constants in MIR for `f`...
|
|
||||||
--> $DIR/const_check_false_cycle.rs:9:1
|
|
||||||
|
|
|
||||||
LL | const fn f() -> impl Eq {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires const checking `f`...
|
|
||||||
--> $DIR/const_check_false_cycle.rs:9:1
|
|
||||||
|
|
|
||||||
LL | const fn f() -> impl Eq {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: ...which requires computing whether `f::{opaque#0}` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `f::{opaque#0}: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `f::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `f::{opaque#0}`
|
|
||||||
--> $DIR/const_check_false_cycle.rs:9:17
|
|
||||||
|
|
|
||||||
LL | const fn f() -> impl Eq {
|
|
||||||
| ^^^^^^^
|
|
||||||
= 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: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0391`.
|
|
|
@ -1,13 +1,12 @@
|
||||||
//! This test causes a cycle error when checking whether the
|
//! This test caused a cycle error when checking whether the
|
||||||
//! return type is `Freeze` during const checking, even though
|
//! return type is `Freeze` during const checking, even though
|
||||||
//! the information is readily available.
|
//! the information is readily available.
|
||||||
|
|
||||||
//@ revisions: current next
|
//@ revisions: current next
|
||||||
//@[next] compile-flags: -Znext-solver
|
//@[next] compile-flags: -Znext-solver
|
||||||
//@[next] check-pass
|
//@ check-pass
|
||||||
|
|
||||||
const fn f() -> impl Eq {
|
const fn f() -> impl Eq {
|
||||||
//[current]~^ ERROR cycle detected
|
|
||||||
g()
|
g()
|
||||||
}
|
}
|
||||||
const fn g() {}
|
const fn g() {}
|
||||||
|
|
|
@ -9,7 +9,6 @@ impl MyTrait for i32 {
|
||||||
//~| ERROR functions in trait impls cannot be declared const
|
//~| ERROR functions in trait impls cannot be declared const
|
||||||
//~| ERROR functions cannot be both `const` and `async`
|
//~| ERROR functions cannot be both `const` and `async`
|
||||||
//~| ERROR method `bar` is not a member
|
//~| ERROR method `bar` is not a member
|
||||||
//~| ERROR cycle detected when computing type
|
|
||||||
main8().await;
|
main8().await;
|
||||||
//~^ ERROR cannot find function
|
//~^ ERROR cannot find function
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ error: using `#![feature(effects)]` without enabling next trait solver globally
|
||||||
= help: use `-Znext-solver` to enable
|
= help: use `-Znext-solver` to enable
|
||||||
|
|
||||||
error[E0425]: cannot find function `main8` in this scope
|
error[E0425]: cannot find function `main8` in this scope
|
||||||
--> $DIR/ice-120503-async-const-method.rs:13:9
|
--> $DIR/ice-120503-async-const-method.rs:12:9
|
||||||
|
|
|
|
||||||
LL | main8().await;
|
LL | main8().await;
|
||||||
| ^^^^^ help: a function with a similar name exists: `main`
|
| ^^^^^ help: a function with a similar name exists: `main`
|
||||||
|
@ -69,38 +69,7 @@ LL | main8().await;
|
||||||
LL | fn main() {}
|
LL | fn main() {}
|
||||||
| --------- similarly named function `main` defined here
|
| --------- similarly named function `main` defined here
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing type of opaque `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar::{opaque#0}`
|
error: aborting due to 6 previous errors; 1 warning emitted
|
||||||
--> $DIR/ice-120503-async-const-method.rs:7:5
|
|
||||||
|
|
|
||||||
LL | async const fn bar(&self) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires borrow-checking `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar`...
|
|
||||||
--> $DIR/ice-120503-async-const-method.rs:7:5
|
|
||||||
|
|
|
||||||
LL | async const fn bar(&self) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires promoting constants in MIR for `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar`...
|
|
||||||
--> $DIR/ice-120503-async-const-method.rs:7:5
|
|
||||||
|
|
|
||||||
LL | async const fn bar(&self) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires const checking `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar`...
|
|
||||||
--> $DIR/ice-120503-async-const-method.rs:7:5
|
|
||||||
|
|
|
||||||
LL | async const fn bar(&self) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: ...which requires computing whether `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar::{opaque#0}` is freeze...
|
|
||||||
= note: ...which requires evaluating trait selection obligation `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar::{opaque#0}: core::marker::Freeze`...
|
|
||||||
= note: ...which again requires computing type of opaque `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `<impl at $DIR/ice-120503-async-const-method.rs:6:1: 6:21>::bar::{opaque#0}`
|
|
||||||
--> $DIR/ice-120503-async-const-method.rs:7:5
|
|
||||||
|
|
|
||||||
LL | async const fn bar(&self) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= 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: aborting due to 7 previous errors; 1 warning emitted
|
Some errors have detailed explanations: E0379, E0407, E0425.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0379, E0391, E0407, E0425.
|
|
||||||
For more information about an error, try `rustc --explain E0379`.
|
For more information about an error, try `rustc --explain E0379`.
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
type Bar = impl Sized;
|
type Bar = impl Sized;
|
||||||
//~^ ERROR: cycle
|
//~^ ERROR: cycle
|
||||||
//~| ERROR: cycle
|
|
||||||
|
|
||||||
fn foo() -> Bar
|
fn foo() -> Bar
|
||||||
where
|
where
|
||||||
|
|
|
@ -10,7 +10,7 @@ note: ...which requires computing type of opaque `Bar::{opaque#0}`...
|
||||||
LL | type Bar = impl Sized;
|
LL | type Bar = impl Sized;
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
note: ...which requires type-checking `foo`...
|
note: ...which requires type-checking `foo`...
|
||||||
--> $DIR/in-where-clause.rs:9:1
|
--> $DIR/in-where-clause.rs:8:1
|
||||||
|
|
|
|
||||||
LL | / fn foo() -> Bar
|
LL | / fn foo() -> Bar
|
||||||
LL | | where
|
LL | | where
|
||||||
|
@ -25,26 +25,6 @@ LL | type Bar = impl Sized;
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
= 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
|
= 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 opaque `Bar::{opaque#0}`
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/in-where-clause.rs:5:12
|
|
||||||
|
|
|
||||||
LL | type Bar = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires type-checking `foo`...
|
|
||||||
--> $DIR/in-where-clause.rs:13:9
|
|
||||||
|
|
|
||||||
LL | [0; 1 + 2]
|
|
||||||
| ^^^^^
|
|
||||||
= note: ...which requires evaluating trait selection obligation `Bar: core::marker::Send`...
|
|
||||||
= note: ...which again requires computing type of opaque `Bar::{opaque#0}`, completing the cycle
|
|
||||||
note: cycle used when computing type of `Bar::{opaque#0}`
|
|
||||||
--> $DIR/in-where-clause.rs:5:12
|
|
||||||
|
|
|
||||||
LL | type Bar = impl Sized;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
= 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: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0391`.
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue