about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRyan1729 <Ryan1729@gmail.com>2020-08-09 00:15:56 -0600
committerRyan1729 <Ryan1729@gmail.com>2020-08-09 00:15:56 -0600
commit84db238fa16891196ed8378f328479867cf1ea39 (patch)
treea57c8b3bb6f48c706bdd1fd043459b37ec24cbcb
parenta1ca12581a5099122a64e64b1dd76cd56de5ef29 (diff)
downloadrust-84db238fa16891196ed8378f328479867cf1ea39.tar.gz
rust-84db238fa16891196ed8378f328479867cf1ea39.zip
add a test example of where transmutes_expressible_as_ptr_casts should not suggest anything
-rw-r--r--tests/ui/transmutes_expressible_as_ptr_casts.fixed14
-rw-r--r--tests/ui/transmutes_expressible_as_ptr_casts.rs14
2 files changed, 26 insertions, 2 deletions
diff --git a/tests/ui/transmutes_expressible_as_ptr_casts.fixed b/tests/ui/transmutes_expressible_as_ptr_casts.fixed
index ab181687e1e..d80c9f62ed0 100644
--- a/tests/ui/transmutes_expressible_as_ptr_casts.fixed
+++ b/tests/ui/transmutes_expressible_as_ptr_casts.fixed
@@ -5,7 +5,7 @@
 #![warn(clippy::useless_transmute)]
 #![warn(clippy::transmute_ptr_to_ptr)]
 
-use std::mem::transmute;
+use std::mem::{size_of, transmute};
 
 // rustc_typeck::check::cast contains documentation about when a cast `e as U` is 
 // valid, which we quote from below.
@@ -75,3 +75,15 @@ fn main() {
 fn trigger_do_check_to_emit_error(in_param: &[i32; 1]) -> *const u8 {
     unsafe { in_param as *const [i32; 1] as *const u8 }
 }
+
+#[repr(C)]
+struct Single(u64);
+
+#[repr(C)]
+struct Pair(u32, u32);
+
+fn cannot_be_expressed_as_pointer_cast(in_param: Single) -> Pair {
+    assert_eq!(size_of::<Single>(), size_of::<Pair>());
+
+    unsafe { transmute::<Single, Pair>(in_param) }
+}
diff --git a/tests/ui/transmutes_expressible_as_ptr_casts.rs b/tests/ui/transmutes_expressible_as_ptr_casts.rs
index 2693094ba6c..4f27a3a88ba 100644
--- a/tests/ui/transmutes_expressible_as_ptr_casts.rs
+++ b/tests/ui/transmutes_expressible_as_ptr_casts.rs
@@ -5,7 +5,7 @@
 #![warn(clippy::useless_transmute)]
 #![warn(clippy::transmute_ptr_to_ptr)]
 
-use std::mem::transmute;
+use std::mem::{size_of, transmute};
 
 // rustc_typeck::check::cast contains documentation about when a cast `e as U` is 
 // valid, which we quote from below.
@@ -75,3 +75,15 @@ fn main() {
 fn trigger_do_check_to_emit_error(in_param: &[i32; 1]) -> *const u8 {
     unsafe { transmute::<&[i32; 1], *const u8>(in_param) }
 }
+
+#[repr(C)]
+struct Single(u64);
+
+#[repr(C)]
+struct Pair(u32, u32);
+
+fn cannot_be_expressed_as_pointer_cast(in_param: Single) -> Pair {
+    assert_eq!(size_of::<Single>(), size_of::<Pair>());
+
+    unsafe { transmute::<Single, Pair>(in_param) }
+}