File tree Expand file tree Collapse file tree 3 files changed +28
-16
lines changed Expand file tree Collapse file tree 3 files changed +28
-16
lines changed Original file line number Diff line number Diff line change @@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
23
23
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
24
24
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
25
25
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26
- refs/heads/beta: 224023dfd167afca95665ebf9f927fa1c301f950
26
+ refs/heads/beta: 22071ec6417948e156cbac2dc23d18c3dfaebbd7
27
27
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
28
28
refs/heads/tmp: 370fe2786109360f7c35b8ba552b83b773dd71d6
29
29
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
Original file line number Diff line number Diff line change @@ -537,25 +537,21 @@ macro_rules! int_impl {
537
537
let mut base = self ;
538
538
let mut acc = Self :: one( ) ;
539
539
540
- let mut prev_base = self ;
541
- let mut base_oflo = false ;
542
- while exp > 0 {
540
+ while exp > 1 {
543
541
if ( exp & 1 ) == 1 {
544
- if base_oflo {
545
- // ensure overflow occurs in the same manner it
546
- // would have otherwise (i.e. signal any exception
547
- // it would have otherwise).
548
- acc = acc * ( prev_base * prev_base) ;
549
- } else {
550
- acc = acc * base;
551
- }
542
+ acc = acc * base;
552
543
}
553
- prev_base = base;
554
- let ( new_base, new_base_oflo) = base. overflowing_mul( base) ;
555
- base = new_base;
556
- base_oflo = new_base_oflo;
557
544
exp /= 2 ;
545
+ base = base * base;
546
+ }
547
+
548
+ // Deal with the final bit of the exponent separately, since
549
+ // squaring the base afterwards is not necessary and may cause a
550
+ // needless overflow.
551
+ if exp == 1 {
552
+ acc = acc * base;
558
553
}
554
+
559
555
acc
560
556
}
561
557
Original file line number Diff line number Diff line change
1
+ // Copyright 2015 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
+ // error-pattern:thread '<main>' panicked at 'arithmetic operation overflowed'
12
+ // compile-flags: -C debug-assertions
13
+
14
+ fn main ( ) {
15
+ let _x = 2i32 . pow ( 1024 ) ;
16
+ }
You can’t perform that action at this time.
0 commit comments