Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6cca6da

Browse files
committed
Revert "When checking whether an impl applies, constrain hidden types of opaque types."
This reverts commit 29a630e.
1 parent fe55c00 commit 6cca6da

25 files changed

+121
-172
lines changed

compiler/rustc_trait_selection/src/traits/select/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2563,7 +2563,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25632563
let InferOk { obligations, .. } = self
25642564
.infcx
25652565
.at(&cause, obligation.param_env)
2566-
.eq(DefineOpaqueTypes::Yes, placeholder_obligation_trait_ref, impl_trait_ref)
2566+
.eq(DefineOpaqueTypes::No, placeholder_obligation_trait_ref, impl_trait_ref)
25672567
.map_err(|e| {
25682568
debug!("match_impl: failed eq_trait_refs due to `{}`", e.to_string(self.tcx()))
25692569
})?;

tests/ui/impl-trait/equality.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn sum_to(n: u32) -> impl Foo {
2222
0
2323
} else {
2424
n + sum_to(n - 1)
25-
//~^ ERROR cannot satisfy `<u32 as Add<impl Foo>>::Output == i32`
25+
//~^ ERROR cannot add `impl Foo` to `u32`
2626
}
2727
}
2828

@@ -32,15 +32,12 @@ trait Leak: Sized {
3232
}
3333
impl<T> Leak for T {
3434
default type T = ();
35-
default fn leak(self) -> Self::T {
36-
panic!()
37-
}
35+
default fn leak(self) -> Self::T { panic!() }
3836
}
3937
impl Leak for i32 {
4038
type T = i32;
41-
fn leak(self) -> i32 {
42-
self
43-
}
39+
fn leak(self) -> i32 { self }
4440
}
4541

46-
fn main() {}
42+
fn main() {
43+
}

tests/ui/impl-trait/equality.stderr

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,20 @@ help: change the type of the numeric literal from `u32` to `i32`
2222
LL | 0_i32
2323
| ~~~
2424

25-
error[E0284]: type annotations needed: cannot satisfy `<u32 as Add<impl Foo>>::Output == i32`
25+
error[E0277]: cannot add `impl Foo` to `u32`
2626
--> $DIR/equality.rs:24:11
2727
|
2828
LL | n + sum_to(n - 1)
29-
| ^ cannot satisfy `<u32 as Add<impl Foo>>::Output == i32`
29+
| ^ no implementation for `u32 + impl Foo`
30+
|
31+
= help: the trait `Add<impl Foo>` is not implemented for `u32`
32+
= help: the following other types implement trait `Add<Rhs>`:
33+
<&'a u32 as Add<u32>>
34+
<&u32 as Add<&u32>>
35+
<u32 as Add<&u32>>
36+
<u32 as Add>
3037

3138
error: aborting due to 2 previous errors; 1 warning emitted
3239

33-
Some errors have detailed explanations: E0284, E0308.
34-
For more information about an error, try `rustc --explain E0284`.
40+
Some errors have detailed explanations: E0277, E0308.
41+
For more information about an error, try `rustc --explain E0277`.

tests/ui/impl-trait/nested_impl_trait.stderr

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,19 @@ error[E0277]: the trait bound `impl Into<u32>: Into<impl Debug>` is not satisfie
4646
--> $DIR/nested_impl_trait.rs:6:46
4747
|
4848
LL | fn bad_in_ret_position(x: impl Into<u32>) -> impl Into<impl Debug> { x }
49-
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for `impl Into<u32>`
49+
| ^^^^^^^^^^^^^^^^^^^^^ the trait `From<impl Into<u32>>` is not implemented for `impl Into<u32>`, which is required by `impl Into<u32>: Into<impl Debug>`
5050
|
51-
help: consider further restricting this bound
52-
|
53-
LL | fn bad_in_ret_position(x: impl Into<u32> + std::fmt::Debug) -> impl Into<impl Debug> { x }
54-
| +++++++++++++++++
51+
= help: the trait `Into<U>` is implemented for `T`
52+
= note: required for `impl Into<u32>` to implement `Into<impl Debug>`
5553

5654
error[E0277]: the trait bound `impl Into<u32>: Into<impl Debug>` is not satisfied
5755
--> $DIR/nested_impl_trait.rs:19:34
5856
|
5957
LL | fn bad(x: impl Into<u32>) -> impl Into<impl Debug> { x }
60-
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for `impl Into<u32>`
61-
|
62-
help: consider further restricting this bound
58+
| ^^^^^^^^^^^^^^^^^^^^^ the trait `From<impl Into<u32>>` is not implemented for `impl Into<u32>`, which is required by `impl Into<u32>: Into<impl Debug>`
6359
|
64-
LL | fn bad(x: impl Into<u32> + std::fmt::Debug) -> impl Into<impl Debug> { x }
65-
| +++++++++++++++++
60+
= help: the trait `Into<U>` is implemented for `T`
61+
= note: required for `impl Into<u32>` to implement `Into<impl Debug>`
6662

6763
error: aborting due to 7 previous errors
6864

tests/ui/impl-trait/recursive-bound-eval.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
//! Test that we can evaluate nested obligations when invoking methods on recursive calls on
2+
//! an RPIT.
3+
4+
//@ check-pass
5+
16
pub trait Parser<E> {
27
fn parse(&self) -> E;
38
}
@@ -9,10 +14,7 @@ impl<E, T: Fn() -> E> Parser<E> for T {
914
}
1015

1116
pub fn recursive_fn<E>() -> impl Parser<E> {
12-
//~^ ERROR: cycle detected
1317
move || recursive_fn().parse()
14-
//~^ ERROR: type annotations needed
15-
//~| ERROR: no method named `parse` found for opaque type
1618
}
1719

1820
fn main() {}

tests/ui/impl-trait/recursive-bound-eval.stderr

Lines changed: 0 additions & 42 deletions
This file was deleted.

tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ impl PartialEq<(Bar, i32)> for Bar {
1111
}
1212

1313
fn foo() -> Foo {
14-
//~^ ERROR overflow evaluating the requirement `Bar: PartialEq<(Foo, i32)>`
14+
//~^ ERROR can't compare `Bar` with `(Foo, i32)`
1515
Bar
1616
}
1717

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
error[E0275]: overflow evaluating the requirement `Bar: PartialEq<(Foo, i32)>`
1+
error[E0277]: can't compare `Bar` with `(Foo, i32)`
22
--> $DIR/recursive-type-alias-impl-trait-declaration.rs:13:13
33
|
44
LL | fn foo() -> Foo {
5-
| ^^^
5+
| ^^^ no implementation for `Bar == (Foo, i32)`
6+
LL |
7+
LL | Bar
8+
| --- return type was inferred to be `Bar` here
9+
|
10+
= help: the trait `PartialEq<(Foo, i32)>` is not implemented for `Bar`
11+
= help: the trait `PartialEq<(Bar, i32)>` is implemented for `Bar`
612

713
error: aborting due to 1 previous error
814

9-
For more information about this error, try `rustc --explain E0275`.
15+
For more information about this error, try `rustc --explain E0277`.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error[E0277]: the trait bound `Foo: Trait<Bar>` is not satisfied
2+
--> $DIR/constrain_in_projection.rs:24:14
3+
|
4+
LL | let x = <Foo as Trait<Bar>>::Assoc::default();
5+
| ^^^ the trait `Trait<Bar>` is not implemented for `Foo`
6+
|
7+
= help: the trait `Trait<()>` is implemented for `Foo`
8+
9+
error: aborting due to 1 previous error
10+
11+
For more information about this error, try `rustc --explain E0277`.

tests/ui/type-alias-impl-trait/constrain_in_projection.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//@ revisions: current next
55
//@ ignore-compare-mode-next-solver (explicit revisions)
66
//@[next] compile-flags: -Znext-solver
7-
//@check-pass
7+
//@[next]check-pass
88

99
#![feature(type_alias_impl_trait)]
1010

@@ -22,6 +22,7 @@ impl Trait<()> for Foo {
2222

2323
fn bop(_: Bar) {
2424
let x = <Foo as Trait<Bar>>::Assoc::default();
25+
//[current]~^ `Foo: Trait<Bar>` is not satisfied
2526
}
2627

2728
fn main() {}

0 commit comments

Comments
 (0)