Skip to content

Commit

Permalink
Rollup merge of rust-lang#123526 - estebank:issue-123442, r=compiler-…
Browse files Browse the repository at this point in the history
…errors

Do not ICE when calling incorrectly defined `transmute` intrinsic

Fix rust-lang#123442
  • Loading branch information
matthiaskrgr authored Apr 6, 2024
2 parents ad3df49 + aa53bc0 commit fc2dbbb
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 2 deletions.
11 changes: 9 additions & 2 deletions compiler/rustc_hir_typeck/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -544,13 +544,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if tcx.fn_sig(did).skip_binder().abi() == RustIntrinsic
&& tcx.item_name(did) == sym::transmute
{
let from = fn_sig.inputs().skip_binder()[0];
let Some(from) = fn_sig.inputs().skip_binder().get(0) else {
let e = self.dcx().span_delayed_bug(
tcx.def_span(did),
"intrinsic fn `transmute` defined with no parameters",
);
self.set_tainted_by_errors(e);
return Ty::new_error(tcx, e);
};
let to = fn_sig.output().skip_binder();
// We defer the transmute to the end of typeck, once all inference vars have
// been resolved or we errored. This is important as we can only check transmute
// on concrete types, but the output type may not be known yet (it would only
// be known if explicitly specified via turbofish).
self.deferred_transmute_checks.borrow_mut().push((from, to, expr.hir_id));
self.deferred_transmute_checks.borrow_mut().push((*from, to, expr.hir_id));
}
if !tcx.features().unsized_fn_params {
// We want to remove some Sized bounds from std functions,
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/intrinsics/incorrect-transmute.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
fn main() {
transmute(); // does not ICE
}

extern "rust-intrinsic" fn transmute() {}
//~^ ERROR intrinsic has wrong number of type parameters: found 0, expected 2
//~| ERROR intrinsics are subject to change
//~| ERROR intrinsic must be in `extern "rust-intrinsic" { ... }` block
25 changes: 25 additions & 0 deletions tests/ui/intrinsics/incorrect-transmute.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
error[E0658]: intrinsics are subject to change
--> $DIR/incorrect-transmute.rs:5:8
|
LL | extern "rust-intrinsic" fn transmute() {}
| ^^^^^^^^^^^^^^^^
|
= help: add `#![feature(intrinsics)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error[E0094]: intrinsic has wrong number of type parameters: found 0, expected 2
--> $DIR/incorrect-transmute.rs:5:37
|
LL | extern "rust-intrinsic" fn transmute() {}
| ^ expected 2 type parameters

error: intrinsic must be in `extern "rust-intrinsic" { ... }` block
--> $DIR/incorrect-transmute.rs:5:40
|
LL | extern "rust-intrinsic" fn transmute() {}
| ^^

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0094, E0658.
For more information about an error, try `rustc --explain E0094`.

0 comments on commit fc2dbbb

Please sign in to comment.