Skip to content

Commit b6ca1e2

Browse files
unsafe_method_assert_unsafe_methods
1 parent 682483f commit b6ca1e2

File tree

1 file changed

+83
-42
lines changed

1 file changed

+83
-42
lines changed

src/frontend.rs

Lines changed: 83 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -312,12 +312,91 @@ macro_rules! unsafe_method {
312312
(
313313
$self:expr =>@ $method:ident
314314
) => {
315-
$crate::unsafe_method!(
315+
$crate::unsafe_method_check_cfg!(
316316
$self =>@ $method =>
317317
)
318318
};
319319
(
320320
$self:expr =>@ $method:ident => $( $arg:expr ),*
321+
) => {
322+
$crate::unsafe_method_check_cfg!(
323+
$self =>@ $method => $( $arg ),*
324+
)
325+
}
326+
}
327+
328+
/// ```compile_fail,E0133
329+
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/arg.rs")]
330+
/// ```
331+
#[cfg(doctest)]
332+
pub const _: () = {};
333+
334+
/// ```compile_fail,E0133
335+
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/self_zero_args.rs")]
336+
/// ```
337+
#[cfg(doctest)]
338+
pub const _: () = {};
339+
340+
/// ```compile_fail,E0133
341+
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/self_some_args.rs")]
342+
/// ```
343+
#[cfg(doctest)]
344+
pub const _: () = {};
345+
//----------------------
346+
347+
#[cfg(not(feature = "assert_unsafe_methods"))]
348+
#[macro_export]
349+
#[doc(hidden)]
350+
macro_rules! unsafe_method_check_cfg {
351+
(
352+
$self:expr =>@ $method:ident => $( $arg:expr ),*
353+
) => {
354+
$crate::unsafe_method_assert_unsafe_methods!(
355+
{}
356+
$self =>@ $method => $( $arg ),*
357+
)
358+
}
359+
}
360+
#[cfg(feature = "assert_unsafe_methods")]
361+
#[macro_export]
362+
#[doc(hidden)]
363+
macro_rules! unsafe_method_check_cfg {
364+
(
365+
$self:expr =>@ $method:ident => $( $arg:expr ),*
366+
) => {
367+
$crate::unsafe_method_assert_unsafe_methods!(
368+
{
369+
type OwnedReceiver = impl Sized;
370+
//let _ = move || -> OwnedReceiver { owned_receiver };
371+
let owned_receiver: OwnedReceiver = owned_receiver;
372+
373+
// Detect code where `unsafe_method!` is not needed at all. Maybe the method used
374+
// to be `unsafe`, but not anymore.
375+
//
376+
// See unsafe_fn for why we can't just use simple coercion like:
377+
// ```
378+
// let _: unsafe fn(_, _,... ) -> _ = OwnedReceiver::$method;
379+
// ```
380+
381+
let _ = OwnedReceiver::$method;
382+
/*let _ = if false {
383+
$crate::expecting_unsafe_fn_path!( first_goes_receiver $(, $arg )* )
384+
} else {
385+
OwnedReceiver::$method
386+
};*/
387+
::core::unreachable!();
388+
}
389+
$self =>@ $method => $( $arg ),*
390+
)
391+
}
392+
}
393+
394+
#[macro_export]
395+
#[doc(hidden)]
396+
macro_rules! unsafe_method_assert_unsafe_methods {
397+
(
398+
{ $( $code_assert_unsafe_methods:tt )* }
399+
$self:expr =>@ $method:ident => $( $arg:expr ),*
321400
) => {
322401
// See unsafe_fn for why here we enclose in (...) and not in {...}.
323402
(
@@ -341,28 +420,9 @@ macro_rules! unsafe_method {
341420
#[allow(invalid_value)] // for &str and other types where zeroed() issues invalid_value warning.
342421
let mut owned_receiver = ::core::mem::replace(mref, unsafe{ ::core::mem::zeroed() });
343422

344-
#[cfg(feature="assert_unsafe_methods")]
345423
if false {
346-
type OwnedReceiver = impl Sized;
347-
//let _ = move || -> OwnedReceiver { owned_receiver };
348-
let owned_receiver: OwnedReceiver = owned_receiver;
349-
350-
// Detect code where `unsafe_method!` is not needed at all. Maybe the method used
351-
// to be `unsafe`, but not anymore.
352-
//
353-
// See unsafe_fn for why we can't just use simple coercion like:
354-
// ```
355-
// let _: unsafe fn(_, _,... ) -> _ = OwnedReceiver::$method;
356-
// ```
357-
358-
let _ = OwnedReceiver::$method;
359-
/*let _ = if false {
360-
$crate::expecting_unsafe_fn_path!( first_goes_receiver $(, $arg )* )
361-
} else {
362-
OwnedReceiver::$method
363-
};*/
364-
::core::unreachable!();
365-
};
424+
$( $code_assert_unsafe_methods )*
425+
}
366426
// @TODO double check and remove:
367427
//
368428
// Detect code where `unsafe_method!` is not needed at all. Maybe the method used
@@ -376,28 +436,9 @@ macro_rules! unsafe_method {
376436
)
377437
}
378438
)
379-
}
439+
}
380440
}
381441

382-
/// ```compile_fail,E0133
383-
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/arg.rs")]
384-
/// ```
385-
#[cfg(doctest)]
386-
pub const _: () = {};
387-
388-
/// ```compile_fail,E0133
389-
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/self_zero_args.rs")]
390-
/// ```
391-
#[cfg(doctest)]
392-
pub const _: () = {};
393-
394-
/// ```compile_fail,E0133
395-
#[doc = include_str!("../violations_coverage/unsafe_method/sneaked_unsafe/self_some_args.rs")]
396-
/// ```
397-
#[cfg(doctest)]
398-
pub const _: () = {};
399-
//----------------------
400-
401442
#[doc(hidden)]
402443
#[macro_export]
403444
macro_rules! unsafe_method_internal_check_args_etc {

0 commit comments

Comments
 (0)