Skip to content

Commit 19fcd29

Browse files
committed
---
yaml --- r: 234218 b: refs/heads/beta c: 22071ec h: refs/heads/master v: v3
1 parent eecb9be commit 19fcd29

File tree

3 files changed

+28
-16
lines changed

3 files changed

+28
-16
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: 224023dfd167afca95665ebf9f927fa1c301f950
26+
refs/heads/beta: 22071ec6417948e156cbac2dc23d18c3dfaebbd7
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: 370fe2786109360f7c35b8ba552b83b773dd71d6
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/src/libcore/num/mod.rs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -537,25 +537,21 @@ macro_rules! int_impl {
537537
let mut base = self;
538538
let mut acc = Self::one();
539539

540-
let mut prev_base = self;
541-
let mut base_oflo = false;
542-
while exp > 0 {
540+
while exp > 1 {
543541
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;
552543
}
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;
557544
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;
558553
}
554+
559555
acc
560556
}
561557

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
}

0 commit comments

Comments
 (0)