File tree 3 files changed +63
-1
lines changed
3 files changed +63
-1
lines changed Original file line number Diff line number Diff line change 15
15
use convert:: { Infallible , TryFrom } ;
16
16
use fmt;
17
17
use intrinsics;
18
+ use ops;
18
19
use str:: FromStr ;
19
20
20
21
/// Provides intentionally-wrapped arithmetic on `T`.
@@ -2223,7 +2224,8 @@ macro_rules! uint_impl {
2223
2224
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2224
2225
#[ inline]
2225
2226
pub fn next_power_of_two( self ) -> Self {
2226
- self . one_less_than_next_power_of_two( ) + 1
2227
+ // Call the trait to get overflow checks
2228
+ ops:: Add :: add( self . one_less_than_next_power_of_two( ) , 1 )
2227
2229
}
2228
2230
2229
2231
/// Returns the smallest power of two greater than or equal to `n`. If
Original file line number Diff line number Diff line change
1
+ // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+
11
+ // compile-flags: -C debug_assertions=yes
12
+
13
+ #![ feature( i128_type) ]
14
+
15
+ use std:: panic;
16
+
17
+ fn main ( ) {
18
+ macro_rules! overflow_test {
19
+ ( $t: ident) => (
20
+ let r = panic:: catch_unwind( || {
21
+ ( $t:: max_value( ) ) . next_power_of_two( )
22
+ } ) ;
23
+ assert!( r. is_err( ) ) ;
24
+
25
+ let r = panic:: catch_unwind( || {
26
+ ( ( $t:: max_value( ) >> 1 ) + 2 ) . next_power_of_two( )
27
+ } ) ;
28
+ assert!( r. is_err( ) ) ;
29
+ )
30
+ }
31
+ overflow_test ! ( u8 ) ;
32
+ overflow_test ! ( u16 ) ;
33
+ overflow_test ! ( u32 ) ;
34
+ overflow_test ! ( u64 ) ;
35
+ overflow_test ! ( u128 ) ;
36
+ }
Original file line number Diff line number Diff line change
1
+ // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+
11
+ // compile-flags: -C debug_assertions=no
12
+
13
+ #![ feature( i128_type) ]
14
+
15
+ fn main ( ) {
16
+ for i in 129 ..256 {
17
+ assert_eq ! ( ( i as u8 ) . next_power_of_two( ) , 0 ) ;
18
+ }
19
+
20
+ assert_eq ! ( ( ( 1u16 << 15 ) + 1 ) . next_power_of_two( ) , 0 ) ;
21
+ assert_eq ! ( ( ( 1u32 << 31 ) + 1 ) . next_power_of_two( ) , 0 ) ;
22
+ assert_eq ! ( ( ( 1u64 << 63 ) + 1 ) . next_power_of_two( ) , 0 ) ;
23
+ assert_eq ! ( ( ( 1u128 << 127 ) + 1 ) . next_power_of_two( ) , 0 ) ;
24
+ }
You can’t perform that action at this time.
0 commit comments