File tree Expand file tree Collapse file tree 3 files changed +20
-4
lines changed Expand file tree Collapse file tree 3 files changed +20
-4
lines changed Original file line number Diff line number Diff line change @@ -29,12 +29,12 @@ impl Timespec {
2929        if  self  >= other { 
3030            Ok ( if  self . t . tv_nsec  >= other. t . tv_nsec  { 
3131                Duration :: new ( 
32-                     ( self . t . tv_sec  -  other. t . tv_sec )  as  u64 , 
32+                     self . t . tv_sec . wrapping_sub ( other. t . tv_sec )  as  u64 , 
3333                    ( self . t . tv_nsec  - other. t . tv_nsec )  as  u32 , 
3434                ) 
3535            }  else  { 
3636                Duration :: new ( 
37-                     ( self . t . tv_sec  - 1  -  other. t . tv_sec )  as  u64 , 
37+                     ( self . t . tv_sec  - 1 ) . wrapping_sub ( other. t . tv_sec )  as  u64 , 
3838                    ( self . t . tv_nsec  + NSEC_PER_SEC  - other. t . tv_nsec )  as  u32 , 
3939                ) 
4040            } ) 
Original file line number Diff line number Diff line change @@ -150,12 +150,12 @@ impl Timespec {
150150            // directly expresses the lower-cost behavior we want from it. 
151151            let  ( secs,  nsec)  = if  self . tv_nsec . as_inner ( )  >= other. tv_nsec . as_inner ( )  { 
152152                ( 
153-                     ( self . tv_sec  -  other. tv_sec )  as  u64 , 
153+                     self . tv_sec . wrapping_sub ( other. tv_sec )  as  u64 , 
154154                    self . tv_nsec . as_inner ( )  - other. tv_nsec . as_inner ( ) , 
155155                ) 
156156            }  else  { 
157157                ( 
158-                     ( self . tv_sec  - other. tv_sec  -  1 )  as  u64 , 
158+                     ( self . tv_sec  - 1 ) . wrapping_sub ( other. tv_sec )  as  u64 , 
159159                    self . tv_nsec . as_inner ( )  + ( NSEC_PER_SEC  as  u32 )  - other. tv_nsec . as_inner ( ) , 
160160                ) 
161161            } ; 
Original file line number Diff line number Diff line change @@ -227,3 +227,19 @@ fn big_math() {
227227    check ( instant. checked_add ( Duration :: from_secs ( 100 ) ) ,  Instant :: checked_sub) ; 
228228    check ( instant. checked_add ( Duration :: from_secs ( i64:: MAX  as  _ ) ) ,  Instant :: checked_sub) ; 
229229} 
230+ 
231+ #[ test]  
232+ #[ cfg( unix) ]  
233+ fn  system_time_duration_since_max_range_on_unix ( )  { 
234+     // Repro regression https://github.com/rust-lang/rust/issues/146228 
235+ 
236+     // Min and max values of `SystemTime` on Unix. 
237+     let  min = SystemTime :: UNIX_EPOCH  - ( Duration :: new ( i64:: MAX  as  u64  + 1 ,  0 ) ) ; 
238+     let  max = SystemTime :: UNIX_EPOCH  + ( Duration :: new ( i64:: MAX  as  u64 ,  999_999_999 ) ) ; 
239+ 
240+     let  delta_a = max. duration_since ( min) . expect ( "duration_since overflow" ) ; 
241+     let  delta_b = min. duration_since ( max) . err ( ) . expect ( "duration_since overflow" ) . duration ( ) ; 
242+ 
243+     assert_eq ! ( Duration :: MAX ,  delta_a) ; 
244+     assert_eq ! ( Duration :: MAX ,  delta_b) ; 
245+ } 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments