Skip to content

Commit db59539

Browse files
authored
fix: missing_transmute_annotations should not contain fn name in suggestion (#17611)
fixes #15839: `missing_transmute_annotations` containing fn name in suggestion (such as `main`) which fails to resolve changelog:[`missing_transmute_annotations`]: remove function names from the suggestion
2 parents 095336b + a48f4f2 commit db59539

4 files changed

Lines changed: 51 additions & 26 deletions

File tree

clippy_lints/src/transmute/missing_transmute_annotations.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use clippy_utils::source::SpanExt as _;
55
use rustc_errors::Applicability;
66
use rustc_hir::{Expr, GenericArg, HirId, LetStmt, Node, Path, TyKind};
77
use rustc_lint::LateContext;
8+
use rustc_middle::ty::print::with_types_for_suggestion;
89
use rustc_middle::ty::{self, Ty};
910
use rustc_span::Span;
1011

@@ -95,7 +96,7 @@ pub(super) fn check<'tcx>(
9596
diag.span_suggestion(
9697
span,
9798
"consider adding missing annotations",
98-
format!("{}::<{from_ty}, {to_ty}>", last.ident),
99+
with_types_for_suggestion!(format!("{}::<{from_ty}, {to_ty}>", last.ident)),
99100
Applicability::MaybeIncorrect,
100101
);
101102
}

tests/ui/missing_transmute_annotations.fixed

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ extern crate macro_rules;
99
macro_rules! local_bad_transmute {
1010
($e:expr) => {
1111
std::mem::transmute::<[u16; 2], i32>($e)
12-
//~^ ERROR: transmute used without annotations
12+
//~^ missing_transmute_annotations
1313
};
1414
}
1515

@@ -36,40 +36,49 @@ unsafe fn foo2() -> i32 {
3636
unsafe {
3737
let mut i: i32 = 0;
3838
i = std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);
39-
//~^ ERROR: transmute used without annotations
39+
//~^ missing_transmute_annotations
4040
i = std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);
41-
//~^ ERROR: transmute used without annotations
41+
//~^ missing_transmute_annotations
4242
i = std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);
43-
//~^ ERROR: transmute used without annotations
43+
//~^ missing_transmute_annotations
4444
i = std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);
45-
//~^ ERROR: transmute used without annotations
45+
//~^ missing_transmute_annotations
4646

4747
let x: i32 = bar(std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]));
48-
//~^ ERROR: transmute used without annotations
48+
//~^ missing_transmute_annotations
4949
bar(std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]));
50-
//~^ ERROR: transmute used without annotations
50+
//~^ missing_transmute_annotations
5151

5252
i = local_bad_transmute!([1u16, 2u16]);
5353

5454
// Should not warn.
5555
i = bad_transmute!([1u16, 2u16]);
5656

5757
i = std::mem::transmute::<[i16; 2], i32>([0i16, 0i16]);
58-
//~^ ERROR: transmute used without annotations
58+
//~^ missing_transmute_annotations
5959

6060
i = std::mem::transmute::<Foo, i32>(Foo::A);
61-
//~^ ERROR: transmute used without annotations
61+
//~^ missing_transmute_annotations
6262

6363
i
6464
}
6565
}
6666

67+
#[expect(invalid_value)]
68+
// https://github.com/rust-lang/rust-clippy/issues/15839
69+
fn function_name_in_suggestion() {
70+
trait T {}
71+
struct S(*mut dyn T);
72+
let _ = S(unsafe { std::mem::transmute::<(usize, usize), *mut dyn T>((0usize, 0usize)) });
73+
//~^ missing_transmute_annotations
74+
}
75+
6776
fn main() {
6877
let x: _ = unsafe { std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]) };
69-
//~^ ERROR: transmute used without annotations
78+
//~^ missing_transmute_annotations
7079
unsafe {
7180
let x: _ = std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);
72-
//~^ ERROR: transmute used without annotations
81+
//~^ missing_transmute_annotations
7382

7483
// Should not warn.
7584
std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);

tests/ui/missing_transmute_annotations.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ extern crate macro_rules;
99
macro_rules! local_bad_transmute {
1010
($e:expr) => {
1111
std::mem::transmute($e)
12-
//~^ ERROR: transmute used without annotations
12+
//~^ missing_transmute_annotations
1313
};
1414
}
1515

@@ -36,40 +36,49 @@ unsafe fn foo2() -> i32 {
3636
unsafe {
3737
let mut i: i32 = 0;
3838
i = std::mem::transmute([1u16, 2u16]);
39-
//~^ ERROR: transmute used without annotations
39+
//~^ missing_transmute_annotations
4040
i = std::mem::transmute::<_, _>([1u16, 2u16]);
41-
//~^ ERROR: transmute used without annotations
41+
//~^ missing_transmute_annotations
4242
i = std::mem::transmute::<_, i32>([1u16, 2u16]);
43-
//~^ ERROR: transmute used without annotations
43+
//~^ missing_transmute_annotations
4444
i = std::mem::transmute::<[u16; 2], _>([1u16, 2u16]);
45-
//~^ ERROR: transmute used without annotations
45+
//~^ missing_transmute_annotations
4646

4747
let x: i32 = bar(std::mem::transmute::<[u16; 2], _>([1u16, 2u16]));
48-
//~^ ERROR: transmute used without annotations
48+
//~^ missing_transmute_annotations
4949
bar(std::mem::transmute::<[u16; 2], _>([1u16, 2u16]));
50-
//~^ ERROR: transmute used without annotations
50+
//~^ missing_transmute_annotations
5151

5252
i = local_bad_transmute!([1u16, 2u16]);
5353

5454
// Should not warn.
5555
i = bad_transmute!([1u16, 2u16]);
5656

5757
i = std::mem::transmute([0i16, 0i16]);
58-
//~^ ERROR: transmute used without annotations
58+
//~^ missing_transmute_annotations
5959

6060
i = std::mem::transmute(Foo::A);
61-
//~^ ERROR: transmute used without annotations
61+
//~^ missing_transmute_annotations
6262

6363
i
6464
}
6565
}
6666

67+
#[expect(invalid_value)]
68+
// https://github.com/rust-lang/rust-clippy/issues/15839
69+
fn function_name_in_suggestion() {
70+
trait T {}
71+
struct S(*mut dyn T);
72+
let _ = S(unsafe { std::mem::transmute((0usize, 0usize)) });
73+
//~^ missing_transmute_annotations
74+
}
75+
6776
fn main() {
6877
let x: _ = unsafe { std::mem::transmute::<_, i32>([1u16, 2u16]) };
69-
//~^ ERROR: transmute used without annotations
78+
//~^ missing_transmute_annotations
7079
unsafe {
7180
let x: _ = std::mem::transmute::<_, i32>([1u16, 2u16]);
72-
//~^ ERROR: transmute used without annotations
81+
//~^ missing_transmute_annotations
7382

7483
// Should not warn.
7584
std::mem::transmute::<[u16; 2], i32>([1u16, 2u16]);

tests/ui/missing_transmute_annotations.stderr

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,22 @@ LL | i = std::mem::transmute(Foo::A);
6161
| ^^^^^^^^^ help: consider adding missing annotations: `transmute::<Foo, i32>`
6262

6363
error: transmute used without annotations
64-
--> tests/ui/missing_transmute_annotations.rs:68:35
64+
--> tests/ui/missing_transmute_annotations.rs:72:34
65+
|
66+
LL | let _ = S(unsafe { std::mem::transmute((0usize, 0usize)) });
67+
| ^^^^^^^^^ help: consider adding missing annotations: `transmute::<(usize, usize), *mut dyn T>`
68+
69+
error: transmute used without annotations
70+
--> tests/ui/missing_transmute_annotations.rs:77:35
6571
|
6672
LL | let x: _ = unsafe { std::mem::transmute::<_, i32>([1u16, 2u16]) };
6773
| ^^^^^^^^^^^^^^^^^^^ help: consider adding missing annotations: `transmute::<[u16; 2], i32>`
6874

6975
error: transmute used without annotations
70-
--> tests/ui/missing_transmute_annotations.rs:71:30
76+
--> tests/ui/missing_transmute_annotations.rs:80:30
7177
|
7278
LL | let x: _ = std::mem::transmute::<_, i32>([1u16, 2u16]);
7379
| ^^^^^^^^^^^^^^^^^^^ help: consider adding missing annotations: `transmute::<[u16; 2], i32>`
7480

75-
error: aborting due to 11 previous errors
81+
error: aborting due to 12 previous errors
7682

0 commit comments

Comments
 (0)