File tree Expand file tree Collapse file tree 3 files changed +63
-1
lines changed Expand file tree Collapse file tree 3 files changed +63
-1
lines changed Original file line number Diff line number Diff line change 1515use convert:: { Infallible , TryFrom } ;
1616use fmt;
1717use intrinsics;
18+ use ops;
1819use str:: FromStr ;
1920
2021/// Provides intentionally-wrapped arithmetic on `T`.
@@ -2223,7 +2224,8 @@ macro_rules! uint_impl {
22232224 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
22242225 #[ inline]
22252226 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 )
22272229 }
22282230
22292231 /// 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