mirror of https://github.com/rust-lang/rust.git
Always make inductive cycles as ambig during typeck
This commit is contained in:
parent
66de611196
commit
b8396d10c4
|
@ -236,7 +236,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
freshener: infcx.freshener(),
|
freshener: infcx.freshener(),
|
||||||
intercrate_ambiguity_causes: None,
|
intercrate_ambiguity_causes: None,
|
||||||
query_mode: TraitQueryMode::Standard,
|
query_mode: TraitQueryMode::Standard,
|
||||||
treat_inductive_cycle: TreatInductiveCycleAs::Recur,
|
treat_inductive_cycle: TreatInductiveCycleAs::Ambig,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ trait B {}
|
||||||
impl<T: A> B for T {}
|
impl<T: A> B for T {}
|
||||||
impl<T: B> A for T {}
|
impl<T: B> A for T {}
|
||||||
impl A for &str {}
|
impl A for &str {}
|
||||||
|
//~^ ERROR type annotations needed: cannot satisfy `&str: A`
|
||||||
impl<T: A + B> A for (T,) {}
|
impl<T: A + B> A for (T,) {}
|
||||||
trait TraitWithAssoc {
|
trait TraitWithAssoc {
|
||||||
type Assoc;
|
type Assoc;
|
||||||
|
|
|
@ -1,5 +1,19 @@
|
||||||
|
error[E0283]: type annotations needed: cannot satisfy `&str: A`
|
||||||
|
--> $DIR/unsound-overlap.rs:10:12
|
||||||
|
|
|
||||||
|
LL | impl A for &str {}
|
||||||
|
| ^^^^
|
||||||
|
|
|
||||||
|
note: multiple `impl`s satisfying `&str: A` found
|
||||||
|
--> $DIR/unsound-overlap.rs:9:1
|
||||||
|
|
|
||||||
|
LL | impl<T: B> A for T {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
LL | impl A for &str {}
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `TraitWithAssoc` for type `((&str,),)`
|
error[E0119]: conflicting implementations of trait `TraitWithAssoc` for type `((&str,),)`
|
||||||
--> $DIR/unsound-overlap.rs:20:1
|
--> $DIR/unsound-overlap.rs:21:1
|
||||||
|
|
|
|
||||||
LL | impl<T: A> TraitWithAssoc for T {
|
LL | impl<T: A> TraitWithAssoc for T {
|
||||||
| ------------------------------- first implementation here
|
| ------------------------------- first implementation here
|
||||||
|
@ -7,6 +21,7 @@ LL | impl<T: A> TraitWithAssoc for T {
|
||||||
LL | impl TraitWithAssoc for ((&str,),) {
|
LL | impl TraitWithAssoc for ((&str,),) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `((&str,),)`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `((&str,),)`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
Some errors have detailed explanations: E0119, E0283.
|
||||||
|
For more information about an error, try `rustc --explain E0119`.
|
||||||
|
|
|
@ -22,6 +22,7 @@ trait FromA<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: A, U: A + FromA<T>> FromA<T> for U {
|
impl<T: A, U: A + FromA<T>> FromA<T> for U {
|
||||||
|
//~^ ERROR cycle detected when computing whether impls specialize one another
|
||||||
default fn from(x: T) -> Self {
|
default fn from(x: T) -> Self {
|
||||||
ToA::to(x)
|
ToA::to(x)
|
||||||
}
|
}
|
||||||
|
@ -42,7 +43,7 @@ where
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
fn foo<T: A, U: A>(x: T, y: U) -> U {
|
fn foo<T: A, U: A>(x: T, y: U) -> U {
|
||||||
x.foo(y.to()).to() //~ ERROR overflow evaluating the requirement
|
x.foo(y.to()).to()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -8,28 +8,21 @@ LL | #![feature(specialization)]
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `T: FromA<U>`
|
error[E0391]: cycle detected when computing whether impls specialize one another
|
||||||
--> $DIR/issue-39448.rs:45:13
|
--> $DIR/issue-39448.rs:24:1
|
||||||
|
|
|
||||||
LL | x.foo(y.to()).to()
|
|
||||||
| ^^
|
|
||||||
|
|
|
||||||
note: required for `T` to implement `FromA<U>`
|
|
||||||
--> $DIR/issue-39448.rs:24:29
|
|
||||||
|
|
|
|
||||||
LL | impl<T: A, U: A + FromA<T>> FromA<T> for U {
|
LL | impl<T: A, U: A + FromA<T>> FromA<T> for U {
|
||||||
| -------- ^^^^^^^^ ^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
|
||||||
| unsatisfied trait bound introduced here
|
|
||||||
note: required for `U` to implement `ToA<T>`
|
|
||||||
--> $DIR/issue-39448.rs:34:12
|
|
||||||
|
|
|
|
||||||
LL | impl<T, U> ToA<U> for T
|
= note: ...which requires evaluating trait selection obligation `u16: FromA<u8>`...
|
||||||
| ^^^^^^ ^
|
= note: ...which again requires computing whether impls specialize one another, completing the cycle
|
||||||
LL | where
|
note: cycle used when building specialization graph of trait `FromA`
|
||||||
LL | U: FromA<T>,
|
--> $DIR/issue-39448.rs:20:1
|
||||||
| -------- unsatisfied trait bound introduced here
|
|
|
||||||
|
LL | trait FromA<T> {
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
= 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; 1 warning emitted
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0275`.
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// FIXME(JohnTitor): Centril pointed out this looks suspicions, we should revisit here.
|
// FIXME(JohnTitor): Centril pointed out this looks suspicions, we should revisit here.
|
||||||
// More context: https://github.com/rust-lang/rust/pull/69192#discussion_r379846796
|
// More context: https://github.com/rust-lang/rust/pull/69192#discussion_r379846796
|
||||||
|
|
||||||
//@ check-pass
|
|
||||||
|
|
||||||
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
||||||
|
|
||||||
trait Foo {
|
trait Foo {
|
||||||
|
@ -19,6 +17,7 @@ impl<T> Bar for T where T: Foo {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Foo for T where T: Bar {
|
impl<T> Foo for T where T: Bar {
|
||||||
|
//~^ ERROR cycle detected when computing whether impls specialize one another
|
||||||
fn foo(&self) {}
|
fn foo(&self) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/issue-39618.rs:7:12
|
--> $DIR/issue-39618.rs:5:12
|
||||||
|
|
|
|
||||||
LL | #![feature(specialization)]
|
LL | #![feature(specialization)]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
|
@ -8,5 +8,21 @@ LL | #![feature(specialization)]
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
warning: 1 warning emitted
|
error[E0391]: cycle detected when computing whether impls specialize one another
|
||||||
|
--> $DIR/issue-39618.rs:19:1
|
||||||
|
|
|
||||||
|
LL | impl<T> Foo for T where T: Bar {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: ...which requires evaluating trait selection obligation `u64: Bar`...
|
||||||
|
= note: ...which again requires computing whether impls specialize one another, completing the cycle
|
||||||
|
note: cycle used when building specialization graph of trait `Foo`
|
||||||
|
--> $DIR/issue-39618.rs:7:1
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
= 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; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|
Loading…
Reference in New Issue