summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/tests/ui/unnecessary_cast.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/tests/ui/unnecessary_cast.rs')
-rw-r--r--src/tools/clippy/tests/ui/unnecessary_cast.rs81
1 files changed, 78 insertions, 3 deletions
diff --git a/src/tools/clippy/tests/ui/unnecessary_cast.rs b/src/tools/clippy/tests/ui/unnecessary_cast.rs
index 282b2f128..c7723ef51 100644
--- a/src/tools/clippy/tests/ui/unnecessary_cast.rs
+++ b/src/tools/clippy/tests/ui/unnecessary_cast.rs
@@ -1,13 +1,43 @@
//@run-rustfix
+//@aux-build:extern_fake_libc.rs
#![warn(clippy::unnecessary_cast)]
#![allow(
- unused_must_use,
clippy::borrow_as_ptr,
clippy::no_effect,
clippy::nonstandard_macro_braces,
- clippy::unnecessary_operation
+ clippy::unnecessary_operation,
+ nonstandard_style,
+ unused
)]
+extern crate extern_fake_libc;
+
+type PtrConstU8 = *const u8;
+type PtrMutU8 = *mut u8;
+
+fn owo<T>(ptr: *const T) -> *const T {
+ ptr as *const T
+}
+
+fn uwu<T, U>(ptr: *const T) -> *const U {
+ ptr as *const U
+}
+
+mod fake_libc {
+ type pid_t = i32;
+ pub unsafe fn getpid() -> pid_t {
+ pid_t::from(0)
+ }
+ // Make sure a where clause does not break it
+ pub fn getpid_SAFE_TRUTH<T: Clone>(t: &T) -> pid_t
+ where
+ T: Clone,
+ {
+ t;
+ unsafe { getpid() }
+ }
+}
+
#[rustfmt::skip]
fn main() {
// Test cast_unnecessary
@@ -22,6 +52,26 @@ fn main() {
1_i32 as i32;
1_f32 as f32;
+ let _: *mut u8 = [1u8, 2].as_ptr() as *const u8 as *mut u8;
+
+ [1u8, 2].as_ptr() as *const u8;
+ [1u8, 2].as_ptr() as *mut u8;
+ [1u8, 2].as_mut_ptr() as *mut u8;
+ [1u8, 2].as_mut_ptr() as *const u8;
+ [1u8, 2].as_ptr() as PtrConstU8;
+ [1u8, 2].as_ptr() as PtrMutU8;
+ [1u8, 2].as_mut_ptr() as PtrMutU8;
+ [1u8, 2].as_mut_ptr() as PtrConstU8;
+ let _: *const u8 = [1u8, 2].as_ptr() as _;
+ let _: *mut u8 = [1u8, 2].as_mut_ptr() as _;
+ let _: *const u8 = [1u8, 2].as_ptr() as *const _;
+ let _: *mut u8 = [1u8, 2].as_mut_ptr() as *mut _;
+
+ owo::<u32>([1u32].as_ptr()) as *const u32;
+ uwu::<u32, u8>([1u32].as_ptr()) as *const u8;
+ // this will not lint in the function body even though they have the same type, instead here
+ uwu::<u32, u32>([1u32].as_ptr()) as *const u32;
+
// macro version
macro_rules! foo {
($a:ident, $b:ident) => {
@@ -35,12 +85,37 @@ fn main() {
foo!(b, f32);
foo!(c, f64);
+ // do not lint cast from cfg-dependant type
+ let x = 0 as std::ffi::c_ulong;
+ let y = x as u64;
+ let x: std::ffi::c_ulong = 0;
+ let y = x as u64;
+
// do not lint cast to cfg-dependant type
- 1 as std::os::raw::c_char;
+ let x = 1 as std::os::raw::c_char;
+ let y = x as u64;
// do not lint cast to alias type
1 as I32Alias;
&1 as &I32Alias;
+ // or from
+ let x: I32Alias = 1;
+ let y = x as u64;
+ fake_libc::getpid_SAFE_TRUTH(&0u32) as i32;
+ extern_fake_libc::getpid_SAFE_TRUTH() as i32;
+ let pid = unsafe { fake_libc::getpid() };
+ pid as i32;
+
+ let i8_ptr: *const i8 = &1;
+ let u8_ptr: *const u8 = &1;
+
+ // cfg dependant pointees
+ i8_ptr as *const std::os::raw::c_char;
+ u8_ptr as *const std::os::raw::c_char;
+
+ // type aliased pointees
+ i8_ptr as *const std::ffi::c_char;
+ u8_ptr as *const std::ffi::c_char;
// issue #9960
macro_rules! bind_var {