Skip to content

Commit f64fe9a

Browse files
committed
Switch can_eq and can_sub to DefineOpaqueTypes::Yes
They are mostly used in diagnostics anyway
1 parent 10e8bca commit f64fe9a

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

compiler/rustc_infer/src/infer/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,9 @@ impl<'tcx> InferCtxt<'tcx> {
843843
{
844844
let origin = &ObligationCause::dummy();
845845
self.probe(|_| {
846-
self.at(origin, param_env).sub(DefineOpaqueTypes::No, expected, actual).is_ok()
846+
// We're only answering whether there could be a subtyping relation, and with
847+
// opaque types, "there could be one", via registering a hidden type.
848+
self.at(origin, param_env).sub(DefineOpaqueTypes::Yes, expected, actual).is_ok()
847849
})
848850
}
849851

@@ -852,7 +854,9 @@ impl<'tcx> InferCtxt<'tcx> {
852854
T: at::ToTrace<'tcx>,
853855
{
854856
let origin = &ObligationCause::dummy();
855-
self.probe(|_| self.at(origin, param_env).eq(DefineOpaqueTypes::No, a, b).is_ok())
857+
// We're only answering whether the types could be the same, and with
858+
// opaque types, "they can be the same", via registering a hidden type.
859+
self.probe(|_| self.at(origin, param_env).eq(DefineOpaqueTypes::Yes, a, b).is_ok())
856860
}
857861

858862
#[instrument(skip(self), level = "debug")]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#![feature(type_alias_impl_trait)]
2+
struct Foo;
3+
4+
type Bar = impl Sized;
5+
//~^ ERROR unconstrained opaque type
6+
7+
impl Foo {
8+
fn foo(self: Bar) {}
9+
//~^ ERROR: invalid `self` parameter type: Bar
10+
}
11+
12+
fn main() {}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
error: unconstrained opaque type
2+
--> $DIR/arbitrary-self-opaque.rs:4:12
3+
|
4+
LL | type Bar = impl Sized;
5+
| ^^^^^^^^^^
6+
|
7+
= note: `Bar` must be used in combination with a concrete type within the same module
8+
9+
error[E0307]: invalid `self` parameter type: Bar
10+
--> $DIR/arbitrary-self-opaque.rs:8:18
11+
|
12+
LL | fn foo(self: Bar) {}
13+
| ^^^
14+
|
15+
= note: type of `self` must be `Self` or a type that dereferences to it
16+
= help: consider changing to `self`, `&self`, `&mut self`, `self: Box<Self>`, `self: Rc<Self>`, `self: Arc<Self>`, or `self: Pin<P>` (where P is one of the previous types except `Self`)
17+
18+
error: aborting due to 2 previous errors
19+
20+
For more information about this error, try `rustc --explain E0307`.

0 commit comments

Comments
 (0)