diff options
| author | Dylan MacKenzie <ecstaticmorse@gmail.com> | 2020-02-08 16:31:59 -0800 |
|---|---|---|
| committer | Dylan MacKenzie <ecstaticmorse@gmail.com> | 2020-02-08 17:18:13 -0800 |
| commit | 2afa99379d9623e50efd290e609447bdc5059af8 (patch) | |
| tree | f7791cf009b1e26f2d5b2b4bff82043b5fd2fb6c | |
| parent | c981d67b509f1ba16c97683ad6dc430429899e49 (diff) | |
| download | rust-2afa99379d9623e50efd290e609447bdc5059af8.tar.gz rust-2afa99379d9623e50efd290e609447bdc5059af8.zip | |
Use bespoke macro instead of `?` inside const fns
| -rw-r--r-- | src/libcore/num/mod.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index f86376cac88..c38f51a0f55 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -10,6 +10,16 @@ use crate::intrinsics; use crate::mem; use crate::str::FromStr; +// Used because the `?` operator is not allowed in a const context. +macro_rules! try_opt { + ($e:expr) => { + match $e { + Some(x) => x, + None => return None, + } + }; +} + macro_rules! impl_nonzero_fmt { ( #[$stability: meta] ( $( $Trait: ident ),+ ) for $Ty: ident ) => { $( @@ -1000,17 +1010,17 @@ $EndFeature, " while exp > 1 { if (exp & 1) == 1 { - acc = acc.checked_mul(base)?; + acc = try_opt!(acc.checked_mul(base)); } exp /= 2; - base = base.checked_mul(base)?; + base = try_opt!(base.checked_mul(base)); } // Deal with the final bit of the exponent separately, since // squaring the base afterwards is not necessary and may cause a // needless overflow. if exp == 1 { - acc = acc.checked_mul(base)?; + acc = try_opt!(acc.checked_mul(base)); } Some(acc) @@ -3126,17 +3136,17 @@ assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);", $EndFe while exp > 1 { if (exp & 1) == 1 { - acc = acc.checked_mul(base)?; + acc = try_opt!(acc.checked_mul(base)); } exp /= 2; - base = base.checked_mul(base)?; + base = try_opt!(base.checked_mul(base)); } // Deal with the final bit of the exponent separately, since // squaring the base afterwards is not necessary and may cause a // needless overflow. if exp == 1 { - acc = acc.checked_mul(base)?; + acc = try_opt!(acc.checked_mul(base)); } Some(acc) |
