fix cast_lossless with macro call

This commit is contained in:
mojave2 2023-09-16 23:17:47 +08:00
parent f54275f20f
commit af2a8478ba
No known key found for this signature in database
4 changed files with 43 additions and 2 deletions

View file

@ -25,7 +25,14 @@ pub(super) fn check(
// The suggestion is to use a function call, so if the original expression
// has parens on the outside, they are no longer needed.
let mut applicability = Applicability::MachineApplicable;
let opt = snippet_opt(cx, cast_op.span);
let opt = snippet_opt(
cx,
if cast_op.span.from_expansion() {
cast_op.span.source_callsite()
} else {
cast_op.span
},
);
let sugg = opt.as_ref().map_or_else(
|| {
applicability = Applicability::HasPlaceholders;

View file

@ -49,3 +49,14 @@ mod cast_lossless_in_impl {
enum Test {
A = u32::MAX as i64 + 1,
}
fn issue11458() {
macro_rules! sign_cast {
($var: ident, $src: ty, $dest: ty) => {
<$dest>::from_ne_bytes(($var as $src).to_ne_bytes())
};
}
let x = 10_u128;
let _ = i32::from(sign_cast!(x, u8, i8));
let _ = i32::from(sign_cast!(x, u8, i8) + 1);
}

View file

@ -49,3 +49,14 @@ mod cast_lossless_in_impl {
enum Test {
A = u32::MAX as i64 + 1,
}
fn issue11458() {
macro_rules! sign_cast {
($var: ident, $src: ty, $dest: ty) => {
<$dest>::from_ne_bytes(($var as $src).to_ne_bytes())
};
}
let x = 10_u128;
let _ = sign_cast!(x, u8, i8) as i32;
let _ = (sign_cast!(x, u8, i8) + 1) as i32;
}

View file

@ -115,5 +115,17 @@ error: casting `u8` to `u16` may become silently lossy if you later change the t
LL | let _ = (1u8 + 1u8) as u16;
| ^^^^^^^^^^^^^^^^^^ help: try: `u16::from(1u8 + 1u8)`
error: aborting due to 19 previous errors
error: casting `i8` to `i32` may become silently lossy if you later change the type
--> $DIR/cast_lossless_integer.rs:60:13
|
LL | let _ = sign_cast!(x, u8, i8) as i32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `i32::from(sign_cast!(x, u8, i8))`
error: casting `i8` to `i32` may become silently lossy if you later change the type
--> $DIR/cast_lossless_integer.rs:61:13
|
LL | let _ = (sign_cast!(x, u8, i8) + 1) as i32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `i32::from(sign_cast!(x, u8, i8) + 1)`
error: aborting due to 21 previous errors