Skip to content

Commit e24bd58

Browse files
cast_slice_from_raw_parts: check for implicit cast to raw slice pointer (#15437)
Fixes: #15127 changelog: [`cast_slice_from_raw_parts`]: check for implicit cast to raw slice pointer changelog: [`cast_slice_from_raw_parts`]: properly select `std/core` <!-- TRIAGEBOT_START --> <!-- TRIAGEBOT_SUMMARY_START --> ### Summary Notes - [Feature-freeze](#15437 (review)) by [samueltardieu](https://github.com/samueltardieu) *Managed by `@rustbot`—see [help](https://forge.rust-lang.org/triagebot/note.html) for details* <!-- TRIAGEBOT_SUMMARY_END --> <!-- TRIAGEBOT_END -->
2 parents ae571c8 + 42cc759 commit e24bd58

8 files changed

+344
-25
lines changed

clippy_lints/src/casts/cast_slice_from_raw_parts.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::msrvs::{self, Msrv};
33
use clippy_utils::source::snippet_with_context;
4+
use clippy_utils::{get_parent_expr, is_no_std_crate};
45
use rustc_errors::Applicability;
56
use rustc_hir::def_id::DefId;
67
use rustc_hir::{Expr, ExprKind};
78
use rustc_lint::LateContext;
9+
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow};
810
use rustc_middle::ty::{self, Ty};
911
use rustc_span::sym;
1012

@@ -42,13 +44,52 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, cast_expr: &Expr<'_>,
4244
let mut applicability = Applicability::MachineApplicable;
4345
let ptr = snippet_with_context(cx, ptr_arg.span, ctxt, "ptr", &mut applicability).0;
4446
let len = snippet_with_context(cx, len_arg.span, ctxt, "len", &mut applicability).0;
47+
let krate = if is_no_std_crate(cx) { "core" } else { "std" };
4548
span_lint_and_sugg(
4649
cx,
4750
CAST_SLICE_FROM_RAW_PARTS,
4851
span,
4952
format!("casting the result of `{func}` to {cast_to}"),
5053
"replace with",
51-
format!("core::ptr::slice_{func}({ptr}, {len})"),
54+
format!("{krate}::ptr::slice_{func}({ptr}, {len})"),
55+
applicability,
56+
);
57+
}
58+
}
59+
60+
/// Checks for implicit cast from slice reference to raw slice pointer.
61+
pub(super) fn check_implicit_cast(cx: &LateContext<'_>, expr: &Expr<'_>) {
62+
if let ExprKind::Call(fun, [ptr_arg, len_arg]) = expr.peel_blocks().kind
63+
&& let ExprKind::Path(ref qpath) = fun.kind
64+
&& let Some(fun_def_id) = cx.qpath_res(qpath, fun.hir_id).opt_def_id()
65+
&& let Some(rpk) = raw_parts_kind(cx, fun_def_id)
66+
&& !matches!(get_parent_expr(cx, expr).map(|e| e.kind), Some(ExprKind::Cast(..)))
67+
&& let [deref, borrow] = cx.typeck_results().expr_adjustments(expr)
68+
&& matches!(deref.kind, Adjust::Deref(..))
69+
&& let Adjustment {
70+
kind: Adjust::Borrow(AutoBorrow::RawPtr(..)),
71+
target,
72+
} = borrow
73+
&& let ty::RawPtr(pointee_ty, _) = target.kind()
74+
&& pointee_ty.is_slice()
75+
&& !expr.span.from_expansion()
76+
{
77+
let func = match rpk {
78+
RawPartsKind::Immutable => "from_raw_parts",
79+
RawPartsKind::Mutable => "from_raw_parts_mut",
80+
};
81+
let mut applicability = Applicability::MachineApplicable;
82+
let ctxt = expr.span.ctxt();
83+
let ptr = snippet_with_context(cx, ptr_arg.span, ctxt, "ptr", &mut applicability).0;
84+
let len = snippet_with_context(cx, len_arg.span, ctxt, "len", &mut applicability).0;
85+
let krate = if is_no_std_crate(cx) { "core" } else { "std" };
86+
span_lint_and_sugg(
87+
cx,
88+
CAST_SLICE_FROM_RAW_PARTS,
89+
expr.span,
90+
format!("implicitly casting the result of `{func}` to `{target}`"),
91+
"replace_with",
92+
format!("{krate}::ptr::slice_{func}({ptr}, {len})"),
5293
applicability,
5394
);
5495
}

clippy_lints/src/casts/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,9 @@ impl<'tcx> LateLintPass<'tcx> for Casts {
911911
if self.msrv.meets(cx, msrvs::RAW_REF_OP) {
912912
borrow_as_ptr::check_implicit_cast(cx, expr);
913913
}
914+
if self.msrv.meets(cx, msrvs::PTR_SLICE_RAW_PARTS) {
915+
cast_slice_from_raw_parts::check_implicit_cast(cx, expr);
916+
}
914917
cast_ptr_alignment::check(cx, expr);
915918
ptr_as_ptr::check(cx, expr, self.msrv);
916919
cast_slice_different_sizes::check(cx, expr, self.msrv);
Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,53 @@
11
#![warn(clippy::cast_slice_from_raw_parts)]
22

3-
#[allow(unused_imports, unused_unsafe)]
3+
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
4+
45
fn main() {
56
let mut vec = vec![0u8; 1];
67
let ptr: *const u8 = vec.as_ptr();
78
let mptr = vec.as_mut_ptr();
8-
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
9+
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts(ptr, 1) };
910
//~^ cast_slice_from_raw_parts
10-
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
11+
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts_mut(mptr, 1) };
1112
//~^ cast_slice_from_raw_parts
12-
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
13+
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
1314
//~^ cast_slice_from_raw_parts
1415
{
1516
use core::slice;
16-
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
17+
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
1718
//~^ cast_slice_from_raw_parts
1819
use slice as one;
19-
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
20+
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
2021
//~^ cast_slice_from_raw_parts
2122
}
2223
{
2324
use std::slice;
24-
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
25+
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
2526
//~^ cast_slice_from_raw_parts
2627
use slice as one;
27-
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
28+
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
2829
//~^ cast_slice_from_raw_parts
2930
}
31+
32+
// implicit cast
33+
{
34+
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts(ptr, 1) };
35+
//~^ cast_slice_from_raw_parts
36+
let _: *mut [u8] = unsafe { std::ptr::slice_from_raw_parts_mut(mptr, 1) };
37+
//~^ cast_slice_from_raw_parts
38+
require_raw_slice_ptr(unsafe { std::ptr::slice_from_raw_parts(ptr, 1) });
39+
//~^ cast_slice_from_raw_parts
40+
}
41+
42+
// implicit cast in const context
43+
const {
44+
const PTR: *const u8 = std::ptr::null();
45+
const MPTR: *mut u8 = std::ptr::null_mut();
46+
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts(PTR, 1) };
47+
//~^ cast_slice_from_raw_parts
48+
let _: *mut [u8] = unsafe { std::ptr::slice_from_raw_parts_mut(MPTR, 1) };
49+
//~^ cast_slice_from_raw_parts
50+
require_raw_slice_ptr(unsafe { std::ptr::slice_from_raw_parts(PTR, 1) });
51+
//~^ cast_slice_from_raw_parts
52+
};
3053
}

tests/ui/cast_raw_slice_pointer_cast.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![warn(clippy::cast_slice_from_raw_parts)]
22

3-
#[allow(unused_imports, unused_unsafe)]
3+
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
4+
45
fn main() {
56
let mut vec = vec![0u8; 1];
67
let ptr: *const u8 = vec.as_ptr();
@@ -27,4 +28,26 @@ fn main() {
2728
let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
2829
//~^ cast_slice_from_raw_parts
2930
}
31+
32+
// implicit cast
33+
{
34+
let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) };
35+
//~^ cast_slice_from_raw_parts
36+
let _: *mut [u8] = unsafe { std::slice::from_raw_parts_mut(mptr, 1) };
37+
//~^ cast_slice_from_raw_parts
38+
require_raw_slice_ptr(unsafe { std::slice::from_raw_parts(ptr, 1) });
39+
//~^ cast_slice_from_raw_parts
40+
}
41+
42+
// implicit cast in const context
43+
const {
44+
const PTR: *const u8 = std::ptr::null();
45+
const MPTR: *mut u8 = std::ptr::null_mut();
46+
let _: *const [u8] = unsafe { std::slice::from_raw_parts(PTR, 1) };
47+
//~^ cast_slice_from_raw_parts
48+
let _: *mut [u8] = unsafe { std::slice::from_raw_parts_mut(MPTR, 1) };
49+
//~^ cast_slice_from_raw_parts
50+
require_raw_slice_ptr(unsafe { std::slice::from_raw_parts(PTR, 1) });
51+
//~^ cast_slice_from_raw_parts
52+
};
3053
}
Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,83 @@
11
error: casting the result of `from_raw_parts` to *const [u8]
2-
--> tests/ui/cast_raw_slice_pointer_cast.rs:8:35
2+
--> tests/ui/cast_raw_slice_pointer_cast.rs:9:35
33
|
44
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) as *const [u8] };
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
66
|
77
= note: `-D clippy::cast-slice-from-raw-parts` implied by `-D warnings`
88
= help: to override `-D warnings` add `#[allow(clippy::cast_slice_from_raw_parts)]`
99

1010
error: casting the result of `from_raw_parts_mut` to *mut [u8]
11-
--> tests/ui/cast_raw_slice_pointer_cast.rs:10:35
11+
--> tests/ui/cast_raw_slice_pointer_cast.rs:11:35
1212
|
1313
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts_mut(mptr, 1) as *mut [u8] };
14-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts_mut(mptr, 1)`
14+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts_mut(mptr, 1)`
1515

1616
error: casting the result of `from_raw_parts` to *const [u8]
17-
--> tests/ui/cast_raw_slice_pointer_cast.rs:12:26
17+
--> tests/ui/cast_raw_slice_pointer_cast.rs:13:26
1818
|
1919
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) } as *const [u8];
20-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
20+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
2121

2222
error: casting the result of `from_raw_parts` to *const [u8]
23-
--> tests/ui/cast_raw_slice_pointer_cast.rs:16:30
23+
--> tests/ui/cast_raw_slice_pointer_cast.rs:17:30
2424
|
2525
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
26-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
26+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
2727

2828
error: casting the result of `from_raw_parts` to *const [u8]
29-
--> tests/ui/cast_raw_slice_pointer_cast.rs:19:30
29+
--> tests/ui/cast_raw_slice_pointer_cast.rs:20:30
3030
|
3131
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
32-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
3333

3434
error: casting the result of `from_raw_parts` to *const [u8]
35-
--> tests/ui/cast_raw_slice_pointer_cast.rs:24:30
35+
--> tests/ui/cast_raw_slice_pointer_cast.rs:25:30
3636
|
3737
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
38-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
38+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
3939

4040
error: casting the result of `from_raw_parts` to *const [u8]
41-
--> tests/ui/cast_raw_slice_pointer_cast.rs:27:30
41+
--> tests/ui/cast_raw_slice_pointer_cast.rs:28:30
4242
|
4343
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
44-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
44+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
4545

46-
error: aborting due to 7 previous errors
46+
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
47+
--> tests/ui/cast_raw_slice_pointer_cast.rs:34:39
48+
|
49+
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) };
50+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(ptr, 1)`
51+
52+
error: implicitly casting the result of `from_raw_parts_mut` to `*mut [u8]`
53+
--> tests/ui/cast_raw_slice_pointer_cast.rs:36:37
54+
|
55+
LL | let _: *mut [u8] = unsafe { std::slice::from_raw_parts_mut(mptr, 1) };
56+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts_mut(mptr, 1)`
57+
58+
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
59+
--> tests/ui/cast_raw_slice_pointer_cast.rs:38:40
60+
|
61+
LL | require_raw_slice_ptr(unsafe { std::slice::from_raw_parts(ptr, 1) });
62+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(ptr, 1)`
63+
64+
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
65+
--> tests/ui/cast_raw_slice_pointer_cast.rs:46:39
66+
|
67+
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(PTR, 1) };
68+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(PTR, 1)`
69+
70+
error: implicitly casting the result of `from_raw_parts_mut` to `*mut [u8]`
71+
--> tests/ui/cast_raw_slice_pointer_cast.rs:48:37
72+
|
73+
LL | let _: *mut [u8] = unsafe { std::slice::from_raw_parts_mut(MPTR, 1) };
74+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts_mut(MPTR, 1)`
75+
76+
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
77+
--> tests/ui/cast_raw_slice_pointer_cast.rs:50:40
78+
|
79+
LL | require_raw_slice_ptr(unsafe { std::slice::from_raw_parts(PTR, 1) });
80+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(PTR, 1)`
81+
82+
error: aborting due to 13 previous errors
4783

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#![warn(clippy::cast_slice_from_raw_parts)]
2+
#![no_std]
3+
#![crate_type = "lib"]
4+
5+
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
6+
7+
fn main() {
8+
let mut arr = [0u8; 1];
9+
let ptr: *const u8 = arr.as_ptr();
10+
let mptr = arr.as_mut_ptr();
11+
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
12+
//~^ cast_slice_from_raw_parts
13+
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
14+
//~^ cast_slice_from_raw_parts
15+
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
16+
//~^ cast_slice_from_raw_parts
17+
{
18+
use core::slice;
19+
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
20+
//~^ cast_slice_from_raw_parts
21+
use slice as one;
22+
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
23+
//~^ cast_slice_from_raw_parts
24+
}
25+
{
26+
use core::slice;
27+
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
28+
//~^ cast_slice_from_raw_parts
29+
use slice as one;
30+
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
31+
//~^ cast_slice_from_raw_parts
32+
}
33+
34+
// implicit cast
35+
{
36+
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
37+
//~^ cast_slice_from_raw_parts
38+
let _: *mut [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
39+
//~^ cast_slice_from_raw_parts
40+
require_raw_slice_ptr(unsafe { core::ptr::slice_from_raw_parts(ptr, 1) });
41+
//~^ cast_slice_from_raw_parts
42+
}
43+
44+
// implicit cast in const context
45+
const {
46+
const PTR: *const u8 = core::ptr::null();
47+
const MPTR: *mut u8 = core::ptr::null_mut();
48+
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(PTR, 1) };
49+
//~^ cast_slice_from_raw_parts
50+
let _: *mut [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(MPTR, 1) };
51+
//~^ cast_slice_from_raw_parts
52+
require_raw_slice_ptr(unsafe { core::ptr::slice_from_raw_parts(PTR, 1) });
53+
//~^ cast_slice_from_raw_parts
54+
};
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#![warn(clippy::cast_slice_from_raw_parts)]
2+
#![no_std]
3+
#![crate_type = "lib"]
4+
5+
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
6+
7+
fn main() {
8+
let mut arr = [0u8; 1];
9+
let ptr: *const u8 = arr.as_ptr();
10+
let mptr = arr.as_mut_ptr();
11+
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) as *const [u8] };
12+
//~^ cast_slice_from_raw_parts
13+
let _: *const [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) as *mut [u8] };
14+
//~^ cast_slice_from_raw_parts
15+
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) } as *const [u8];
16+
//~^ cast_slice_from_raw_parts
17+
{
18+
use core::slice;
19+
let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
20+
//~^ cast_slice_from_raw_parts
21+
use slice as one;
22+
let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
23+
//~^ cast_slice_from_raw_parts
24+
}
25+
{
26+
use core::slice;
27+
let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
28+
//~^ cast_slice_from_raw_parts
29+
use slice as one;
30+
let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
31+
//~^ cast_slice_from_raw_parts
32+
}
33+
34+
// implicit cast
35+
{
36+
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) };
37+
//~^ cast_slice_from_raw_parts
38+
let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) };
39+
//~^ cast_slice_from_raw_parts
40+
require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(ptr, 1) });
41+
//~^ cast_slice_from_raw_parts
42+
}
43+
44+
// implicit cast in const context
45+
const {
46+
const PTR: *const u8 = core::ptr::null();
47+
const MPTR: *mut u8 = core::ptr::null_mut();
48+
let _: *const [u8] = unsafe { core::slice::from_raw_parts(PTR, 1) };
49+
//~^ cast_slice_from_raw_parts
50+
let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(MPTR, 1) };
51+
//~^ cast_slice_from_raw_parts
52+
require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(PTR, 1) });
53+
//~^ cast_slice_from_raw_parts
54+
};
55+
}

0 commit comments

Comments
 (0)