Skip to content

Commit 0f632c8

Browse files
Fix ICE in default impl error reporting
1 parent 32dae91 commit 0f632c8

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

compiler/rustc_middle/src/ty/error.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,9 @@ impl<'tcx> TyCtxt<'tcx> {
430430
(ty::Projection(_), ty::Projection(_)) => {
431431
diag.note("an associated type was expected, but a different one was found");
432432
}
433-
(ty::Param(p), ty::Projection(proj)) | (ty::Projection(proj), ty::Param(p)) => {
433+
(ty::Param(p), ty::Projection(proj)) | (ty::Projection(proj), ty::Param(p))
434+
if self.def_kind(proj.item_def_id) != DefKind::ImplTraitPlaceholder =>
435+
{
434436
let generics = self.generics_of(body_owner_def_id);
435437
let p_span = self.def_span(generics.type_param(p, self).def_id);
436438
if !sp.contains(p_span) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// FIXME(compiler-errors): I'm not exactly sure if this is expected to pass or not.
2+
// But we fixed an ICE anyways.
3+
4+
#![feature(specialization)]
5+
#![feature(return_position_impl_trait_in_trait)]
6+
#![allow(incomplete_features)]
7+
8+
trait Foo {
9+
fn bar(&self) -> impl Sized;
10+
}
11+
12+
default impl<U> Foo for U
13+
where
14+
U: Copy,
15+
{
16+
fn bar(&self) -> U {
17+
//~^ ERROR method `bar` has an incompatible type for trait
18+
*self
19+
}
20+
}
21+
22+
impl Foo for i32 {}
23+
24+
fn main() {
25+
1i32.bar();
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
error[E0053]: method `bar` has an incompatible type for trait
2+
--> $DIR/specialization-broken.rs:16:22
3+
|
4+
LL | default impl<U> Foo for U
5+
| - this type parameter
6+
...
7+
LL | fn bar(&self) -> U {
8+
| ^
9+
| |
10+
| expected associated type, found type parameter `U`
11+
| help: change the output type to match the trait: `impl Sized`
12+
|
13+
note: type in trait
14+
--> $DIR/specialization-broken.rs:9:22
15+
|
16+
LL | fn bar(&self) -> impl Sized;
17+
| ^^^^^^^^^^
18+
= note: expected fn pointer `fn(&U) -> impl Sized`
19+
found fn pointer `fn(&U) -> U`
20+
21+
error: aborting due to previous error
22+
23+
For more information about this error, try `rustc --explain E0053`.

0 commit comments

Comments
 (0)