@@ -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]
403444macro_rules! unsafe_method_internal_check_args_etc {
0 commit comments