about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-11-22 00:01:10 +0100
committerGitHub <noreply@github.com>2022-11-22 00:01:10 +0100
commit9cefd9dd29a918e26f10df08eaef401cd5d651e4 (patch)
tree923133215087329acc06f6c49a7f94fcbf8383e9
parent89be53d596210cf487d73507ef682af7d3f72944 (diff)
parentfec6ffc8164692c9acc64078126275a2c2b99bcb (diff)
downloadrust-9cefd9dd29a918e26f10df08eaef401cd5d651e4.tar.gz
rust-9cefd9dd29a918e26f10df08eaef401cd5d651e4.zip
Rollup merge of #104657 - hi-rustin:rustin-patch-check-transmute, r=compiler-errors
Do not check transmute if has non region infer

close https://github.com/rust-lang/rust/issues/104609

See: https://github.com/rust-lang/rust/issues/104609#issuecomment-1320956351

r? `@compiler-errors`
-rw-r--r--compiler/rustc_hir_typeck/src/intrinsicck.rs7
-rw-r--r--src/test/ui/consts/issue-104609.rs10
-rw-r--r--src/test/ui/consts/issue-104609.stderr9
3 files changed, 24 insertions, 2 deletions
diff --git a/compiler/rustc_hir_typeck/src/intrinsicck.rs b/compiler/rustc_hir_typeck/src/intrinsicck.rs
index 9812d96fcc3..c2dc1402465 100644
--- a/compiler/rustc_hir_typeck/src/intrinsicck.rs
+++ b/compiler/rustc_hir_typeck/src/intrinsicck.rs
@@ -3,7 +3,7 @@ use rustc_errors::struct_span_err;
 use rustc_hir as hir;
 use rustc_index::vec::Idx;
 use rustc_middle::ty::layout::{LayoutError, SizeSkeleton};
-use rustc_middle::ty::{self, Ty, TyCtxt};
+use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitable};
 use rustc_target::abi::{Pointer, VariantIdx};
 
 use super::FnCtxt;
@@ -46,7 +46,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
         let from = normalize(from);
         let to = normalize(to);
         trace!(?from, ?to);
-
+        if from.has_non_region_infer() || to.has_non_region_infer() {
+            tcx.sess.delay_span_bug(span, "argument to transmute has inference variables");
+            return;
+        }
         // Transmutes that are only changing lifetimes are always ok.
         if from == to {
             return;
diff --git a/src/test/ui/consts/issue-104609.rs b/src/test/ui/consts/issue-104609.rs
new file mode 100644
index 00000000000..01fd1c48cf8
--- /dev/null
+++ b/src/test/ui/consts/issue-104609.rs
@@ -0,0 +1,10 @@
+fn foo() {
+    oops;
+    //~^ ERROR: cannot find value `oops` in this scope
+}
+
+unsafe fn bar() {
+    std::mem::transmute::<_, *mut _>(1_u8);
+}
+
+fn main() {}
diff --git a/src/test/ui/consts/issue-104609.stderr b/src/test/ui/consts/issue-104609.stderr
new file mode 100644
index 00000000000..00360c44d61
--- /dev/null
+++ b/src/test/ui/consts/issue-104609.stderr
@@ -0,0 +1,9 @@
+error[E0425]: cannot find value `oops` in this scope
+  --> $DIR/issue-104609.rs:2:5
+   |
+LL |     oops;
+   |     ^^^^ not found in this scope
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0425`.