Skip to content

Commit

Permalink
Don't ice on bad transmute in typeck in new solver
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Dec 25, 2024
1 parent 409998c commit 1677200
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 1 deletion.
12 changes: 11 additions & 1 deletion compiler/rustc_hir_typeck/src/intrinsicck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let span = tcx.hir().span(hir_id);
let normalize = |ty| {
let ty = self.resolve_vars_if_possible(ty);
self.tcx.normalize_erasing_regions(self.typing_env(self.param_env), ty)
if let Ok(ty) =
self.tcx.try_normalize_erasing_regions(self.typing_env(self.param_env), ty)
{
ty
} else {
Ty::new_error_with_message(
tcx,
span,
"tried to normalize non-wf type in check_transmute",
)
}
};
let from = normalize(from);
let to = normalize(to);
Expand Down
17 changes: 17 additions & 0 deletions tests/ui/traits/next-solver/dont-ice-on-bad-transmute-in-typeck.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//@ compile-flags: -Znext-solver

trait Trait<'a> {
type Assoc;
}

fn foo(x: for<'a> fn(<() as Trait<'a>>::Assoc)) {
//~^ ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
//~| ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
//~| ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
unsafe { std::mem::transmute::<_, ()>(x); }
//~^ ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
//~| ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
//~| ERROR the trait bound `for<'a> (): Trait<'a>` is not satisfied
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:7:11
|
LL | fn foo(x: for<'a> fn(<() as Trait<'a>>::Assoc)) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:7:8
|
LL | fn foo(x: for<'a> fn(<() as Trait<'a>>::Assoc)) {
| ^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:11:14
|
LL | unsafe { std::mem::transmute::<_, ()>(x); }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:11:36
|
LL | unsafe { std::mem::transmute::<_, ()>(x); }
| ^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:11:43
|
LL | unsafe { std::mem::transmute::<_, ()>(x); }
| ^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error[E0277]: the trait bound `for<'a> (): Trait<'a>` is not satisfied
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:7:1
|
LL | fn foo(x: for<'a> fn(<() as Trait<'a>>::Assoc)) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> Trait<'a>` is not implemented for `()`
|
help: this trait has no implementations, consider adding one
--> $DIR/dont-ice-on-bad-transmute-in-typeck.rs:3:1
|
LL | trait Trait<'a> {
| ^^^^^^^^^^^^^^^

error: aborting due to 6 previous errors

For more information about this error, try `rustc --explain E0277`.

0 comments on commit 1677200

Please sign in to comment.