@@ -20,10 +20,14 @@ use core::fmt;
20
20
#[ cfg( feature = "std" ) ]
21
21
use core:: hash:: { Hash , BuildHasher } ;
22
22
use core:: marker:: PhantomData ;
23
+ #[ cfg( all( feature="unstable" ) ) ]
24
+ use core:: mem;
23
25
#[ cfg( feature = "std" ) ]
24
26
use std:: net;
25
27
#[ cfg( feature = "std" ) ]
26
28
use std:: path;
29
+ #[ cfg( all( feature="unstable" ) ) ]
30
+ use core:: slice;
27
31
use core:: str;
28
32
#[ cfg( feature = "std" ) ]
29
33
use std:: ffi:: { CString , OsString } ;
@@ -57,10 +61,6 @@ use std;
57
61
#[ cfg( feature = "unstable" ) ]
58
62
use core:: nonzero:: { NonZero , Zeroable } ;
59
63
60
- #[ cfg( feature = "unstable" ) ]
61
- #[ allow( deprecated) ] // required for impl Deserialize for NonZero<T>
62
- use core:: num:: Zero ;
63
-
64
64
use de:: { Deserialize , Deserializer , EnumVisitor , Error , MapVisitor , SeqVisitor , Unexpected ,
65
65
VariantVisitor , Visitor } ;
66
66
use de:: from_primitive:: FromPrimitive ;
@@ -1409,18 +1409,23 @@ impl<Idx: Deserialize> Deserialize for std::ops::Range<Idx> {
1409
1409
///////////////////////////////////////////////////////////////////////////////
1410
1410
1411
1411
#[ cfg( feature = "unstable" ) ]
1412
- #[ allow( deprecated) ] // num::Zero is deprecated but there is no replacement
1413
1412
impl < T > Deserialize for NonZero < T >
1414
- where T : Deserialize + PartialEq + Zeroable + Zero
1413
+ where T : Deserialize + Zeroable
1415
1414
{
1416
1415
fn deserialize < D > ( deserializer : D ) -> Result < NonZero < T > , D :: Error >
1417
1416
where D : Deserializer
1418
1417
{
1419
1418
let value = try!( Deserialize :: deserialize ( deserializer) ) ;
1420
- if value == Zero :: zero ( ) {
1421
- return Err ( Error :: custom ( "expected a non-zero value" ) ) ;
1422
- }
1423
- unsafe { Ok ( NonZero :: new ( value) ) }
1419
+ unsafe {
1420
+ let ptr = & value as * const T as * const u8 ;
1421
+ if slice:: from_raw_parts ( ptr, mem:: size_of :: < T > ( ) ) . iter ( ) . all ( |& b| b == 0 ) {
1422
+ return Err ( Error :: custom ( "expected a non-zero value" ) ) ;
1423
+ }
1424
+ // Waiting for a safe way to construct NonZero<T>:
1425
+ // https://github.com/rust-lang/rust/issues/27730#issuecomment-269726075
1426
+ Ok ( NonZero :: new ( value) )
1427
+ }
1428
+
1424
1429
}
1425
1430
}
1426
1431
0 commit comments