about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-04-06 01:15:31 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-04-06 01:15:31 +0000
commitaa53bc0b04cb53ca59285b48679adce0f33a4410 (patch)
treeb5a09c31ba01cda433507f34e803d73cf4fc62f5
parent76cf07d5df52c07c3cd4cfeea1ab32b1cfba71bf (diff)
downloadrust-aa53bc0b04cb53ca59285b48679adce0f33a4410.tar.gz
rust-aa53bc0b04cb53ca59285b48679adce0f33a4410.zip
Do not ICE when calling incorrectly defined `transmute` intrinsic
Fix #123442
-rw-r--r--compiler/rustc_hir_typeck/src/expr.rs11
-rw-r--r--tests/ui/intrinsics/incorrect-transmute.rs8
-rw-r--r--tests/ui/intrinsics/incorrect-transmute.stderr25
3 files changed, 42 insertions, 2 deletions
diff --git a/compiler/rustc_hir_typeck/src/expr.rs b/compiler/rustc_hir_typeck/src/expr.rs
index d3e6eb124f7..6d9dc098fbe 100644
--- a/compiler/rustc_hir_typeck/src/expr.rs
+++ b/compiler/rustc_hir_typeck/src/expr.rs
@@ -547,13 +547,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,
diff --git a/tests/ui/intrinsics/incorrect-transmute.rs b/tests/ui/intrinsics/incorrect-transmute.rs
new file mode 100644
index 00000000000..4f1d1491ec9
--- /dev/null
+++ b/tests/ui/intrinsics/incorrect-transmute.rs
@@ -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
diff --git a/tests/ui/intrinsics/incorrect-transmute.stderr b/tests/ui/intrinsics/incorrect-transmute.stderr
new file mode 100644
index 00000000000..20b95925b76
--- /dev/null
+++ b/tests/ui/intrinsics/incorrect-transmute.stderr
@@ -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`.