Skip to content

Commit 97152da

Browse files
committed
Switch can_eq and can_sub to DefineOpaqueTypes::Yes
They are mostly used in diagnostics anyway
1 parent 9d30a93 commit 97152da

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
@@ -935,7 +935,9 @@ impl<'tcx> InferCtxt<'tcx> {
935935
{
936936
let origin = &ObligationCause::dummy();
937937
self.probe(|_| {
938-
self.at(origin, param_env).sub(DefineOpaqueTypes::No, expected, actual).is_ok()
938+
// We're only answering whether there could be a subtyping relation, and with
939+
// opaque types, "there could be one", via registering a hidden type.
940+
self.at(origin, param_env).sub(DefineOpaqueTypes::Yes, expected, actual).is_ok()
939941
})
940942
}
941943

@@ -944,7 +946,9 @@ impl<'tcx> InferCtxt<'tcx> {
944946
T: at::ToTrace<'tcx>,
945947
{
946948
let origin = &ObligationCause::dummy();
947-
self.probe(|_| self.at(origin, param_env).eq(DefineOpaqueTypes::No, a, b).is_ok())
949+
// We're only answering whether the types could be the same, and with
950+
// opaque types, "they can be the same", via registering a hidden type.
951+
self.probe(|_| self.at(origin, param_env).eq(DefineOpaqueTypes::Yes, a, b).is_ok())
948952
}
949953

950954
#[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)