make shift builtins panic-free with new unchecked_sh* intrinsics · rust-lang/rust@cc23d17 (original) (raw)

`@@ -177,7 +177,7 @@ macro_rules! checked_op {

`

177

177

``

178

178

`` // Int + SignedInt implemented for signed integers

``

179

179

`macro_rules! int_impl {

`

180

``

`-

($ActualT:ident, UnsignedT:ty,UnsignedT:ty, UnsignedT:ty,BITS:expr,

`

``

180

`+

($SelfT:ty, ActualT:ident,ActualT:ident, ActualT:ident,UnsignedT:ty, $BITS:expr,

`

181

181

` $add_with_overflow:path,

`

182

182

` $sub_with_overflow:path,

`

183

183

` $mul_with_overflow:path) => {

`

`@@ -850,6 +850,16 @@ macro_rules! int_impl {

`

850

850

```` /// ```


`851`

`851`

` #[stable(feature = "num_wrapping", since = "1.2.0")]

`

`852`

`852`

` #[inline(always)]

`

``

`853`

`+

#[cfg(not(stage0))]

`

``

`854`

`+

pub fn wrapping_shl(self, rhs: u32) -> Self {

`

``

`855`

`+

unsafe {

`

``

`856`

`+

intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)

`

``

`857`

`+

}

`

``

`858`

`+

}

`

``

`859`

`+`

``

`860`

`+

/// Stage 0

`

``

`861`

`+

#[stable(feature = "num_wrapping", since = "1.2.0")]

`

``

`862`

`+

#[cfg(stage0)]

`

`853`

`863`

`pub fn wrapping_shl(self, rhs: u32) -> Self {

`

`854`

`864`

`self.overflowing_shl(rhs).0

`

`855`

`865`

`}

`

`@@ -875,6 +885,16 @@ macro_rules! int_impl {

`

`875`

`885`

```` /// ```

876

886

` #[stable(feature = "num_wrapping", since = "1.2.0")]

`

877

887

` #[inline(always)]

`

``

888

`+

#[cfg(not(stage0))]

`

``

889

`+

pub fn wrapping_shr(self, rhs: u32) -> Self {

`

``

890

`+

unsafe {

`

``

891

`+

intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)

`

``

892

`+

}

`

``

893

`+

}

`

``

894

+

``

895

`+

/// Stage 0

`

``

896

`+

#[stable(feature = "num_wrapping", since = "1.2.0")]

`

``

897

`+

#[cfg(stage0)]

`

878

898

`pub fn wrapping_shr(self, rhs: u32) -> Self {

`

879

899

`self.overflowing_shr(rhs).0

`

880

900

`}

`

`@@ -1089,6 +1109,15 @@ macro_rules! int_impl {

`

1089

1109

```` /// ```


`1090`

`1110`

` #[inline]

`

`1091`

`1111`

` #[stable(feature = "wrapping", since = "1.7.0")]

`

``

`1112`

`+

#[cfg(not(stage0))]

`

``

`1113`

`+

pub fn overflowing_shl(self, rhs: u32) -> (Self, bool) {

`

``

`1114`

`+

(self.wrapping_shl(rhs), (rhs > ($BITS - 1)))

`

``

`1115`

`+

}

`

``

`1116`

`+`

``

`1117`

`+

/// Stage 0

`

``

`1118`

`+

#[inline]

`

``

`1119`

`+

#[stable(feature = "wrapping", since = "1.7.0")]

`

``

`1120`

`+

#[cfg(stage0)]

`

`1092`

`1121`

`pub fn overflowing_shl(self, rhs: u32) -> (Self, bool) {

`

`1093`

`1122`

`(self << (rhs & ($BITS - 1)), (rhs > ($BITS - 1)))

`

`1094`

`1123`

`}

`

`@@ -1111,6 +1140,15 @@ macro_rules! int_impl {

`

`1111`

`1140`

```` /// ```

1112

1141

` #[inline]

`

1113

1142

` #[stable(feature = "wrapping", since = "1.7.0")]

`

``

1143

`+

#[cfg(not(stage0))]

`

``

1144

`+

pub fn overflowing_shr(self, rhs: u32) -> (Self, bool) {

`

``

1145

`+

(self.wrapping_shr(rhs), (rhs > ($BITS - 1)))

`

``

1146

`+

}

`

``

1147

+

``

1148

`+

/// Stage 0

`

``

1149

`+

#[inline]

`

``

1150

`+

#[stable(feature = "wrapping", since = "1.7.0")]

`

``

1151

`+

#[cfg(stage0)]

`

1114

1152

`pub fn overflowing_shr(self, rhs: u32) -> (Self, bool) {

`

1115

1153

`(self >> (rhs & ($BITS - 1)), (rhs > ($BITS - 1)))

`

1116

1154

`}

`

`@@ -1268,39 +1306,39 @@ macro_rules! int_impl {

`

1268

1306

``

1269

1307

`#[lang = "i8"]

`

1270

1308

`impl i8 {

`

1271

``

`-

int_impl! { i8, u8, 8,

`

``

1309

`+

int_impl! { i8, i8, u8, 8,

`

1272

1310

` intrinsics::add_with_overflow,

`

1273

1311

` intrinsics::sub_with_overflow,

`

1274

1312

` intrinsics::mul_with_overflow }

`

1275

1313

`}

`

1276

1314

``

1277

1315

`#[lang = "i16"]

`

1278

1316

`impl i16 {

`

1279

``

`-

int_impl! { i16, u16, 16,

`

``

1317

`+

int_impl! { i16, i16, u16, 16,

`

1280

1318

` intrinsics::add_with_overflow,

`

1281

1319

` intrinsics::sub_with_overflow,

`

1282

1320

` intrinsics::mul_with_overflow }

`

1283

1321

`}

`

1284

1322

``

1285

1323

`#[lang = "i32"]

`

1286

1324

`impl i32 {

`

1287

``

`-

int_impl! { i32, u32, 32,

`

``

1325

`+

int_impl! { i32, i32, u32, 32,

`

1288

1326

` intrinsics::add_with_overflow,

`

1289

1327

` intrinsics::sub_with_overflow,

`

1290

1328

` intrinsics::mul_with_overflow }

`

1291

1329

`}

`

1292

1330

``

1293

1331

`#[lang = "i64"]

`

1294

1332

`impl i64 {

`

1295

``

`-

int_impl! { i64, u64, 64,

`

``

1333

`+

int_impl! { i64, i64, u64, 64,

`

1296

1334

` intrinsics::add_with_overflow,

`

1297

1335

` intrinsics::sub_with_overflow,

`

1298

1336

` intrinsics::mul_with_overflow }

`

1299

1337

`}

`

1300

1338

``

1301

1339

`#[lang = "i128"]

`

1302

1340

`impl i128 {

`

1303

``

`-

int_impl! { i128, u128, 128,

`

``

1341

`+

int_impl! { i128, i128, u128, 128,

`

1304

1342

` intrinsics::add_with_overflow,

`

1305

1343

` intrinsics::sub_with_overflow,

`

1306

1344

` intrinsics::mul_with_overflow }

`

`@@ -1309,7 +1347,7 @@ impl i128 {

`

1309

1347

`#[cfg(target_pointer_width = "16")]

`

1310

1348

`#[lang = "isize"]

`

1311

1349

`impl isize {

`

1312

``

`-

int_impl! { i16, u16, 16,

`

``

1350

`+

int_impl! { isize, i16, u16, 16,

`

1313

1351

` intrinsics::add_with_overflow,

`

1314

1352

` intrinsics::sub_with_overflow,

`

1315

1353

` intrinsics::mul_with_overflow }

`

`@@ -1318,7 +1356,7 @@ impl isize {

`

1318

1356

`#[cfg(target_pointer_width = "32")]

`

1319

1357

`#[lang = "isize"]

`

1320

1358

`impl isize {

`

1321

``

`-

int_impl! { i32, u32, 32,

`

``

1359

`+

int_impl! { isize, i32, u32, 32,

`

1322

1360

` intrinsics::add_with_overflow,

`

1323

1361

` intrinsics::sub_with_overflow,

`

1324

1362

` intrinsics::mul_with_overflow }

`

`@@ -1327,15 +1365,15 @@ impl isize {

`

1327

1365

`#[cfg(target_pointer_width = "64")]

`

1328

1366

`#[lang = "isize"]

`

1329

1367

`impl isize {

`

1330

``

`-

int_impl! { i64, u64, 64,

`

``

1368

`+

int_impl! { isize, i64, u64, 64,

`

1331

1369

` intrinsics::add_with_overflow,

`

1332

1370

` intrinsics::sub_with_overflow,

`

1333

1371

` intrinsics::mul_with_overflow }

`

1334

1372

`}

`

1335

1373

``

1336

1374

`` // Int + UnsignedInt implemented for unsigned integers

``

1337

1375

`macro_rules! uint_impl {

`

1338

``

`-

($ActualT:ty, $BITS:expr,

`

``

1376

`+

($SelfT:ty, ActualT:ty,ActualT:ty, ActualT:ty,BITS:expr,

`

1339

1377

` $ctpop:path,

`

1340

1378

` $ctlz:path,

`

1341

1379

` $cttz:path,

`

`@@ -1978,6 +2016,16 @@ macro_rules! uint_impl {

`

1978

2016

```` /// ```


`1979`

`2017`

` #[stable(feature = "num_wrapping", since = "1.2.0")]

`

`1980`

`2018`

` #[inline(always)]

`

``

`2019`

`+

#[cfg(not(stage0))]

`

``

`2020`

`+

pub fn wrapping_shl(self, rhs: u32) -> Self {

`

``

`2021`

`+

unsafe {

`

``

`2022`

`+

intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)

`

``

`2023`

`+

}

`

``

`2024`

`+

}

`

``

`2025`

`+`

``

`2026`

`+

/// Stage 0

`

``

`2027`

`+

#[stable(feature = "num_wrapping", since = "1.2.0")]

`

``

`2028`

`+

#[cfg(stage0)]

`

`1981`

`2029`

`pub fn wrapping_shl(self, rhs: u32) -> Self {

`

`1982`

`2030`

`self.overflowing_shl(rhs).0

`

`1983`

`2031`

`}

`

`@@ -2003,6 +2051,16 @@ macro_rules! uint_impl {

`

`2003`

`2051`

```` /// ```

2004

2052

` #[stable(feature = "num_wrapping", since = "1.2.0")]

`

2005

2053

` #[inline(always)]

`

``

2054

`+

#[cfg(not(stage0))]

`

``

2055

`+

pub fn wrapping_shr(self, rhs: u32) -> Self {

`

``

2056

`+

unsafe {

`

``

2057

`+

intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)

`

``

2058

`+

}

`

``

2059

`+

}

`

``

2060

+

``

2061

`+

/// Stage 0

`

``

2062

`+

#[stable(feature = "num_wrapping", since = "1.2.0")]

`

``

2063

`+

#[cfg(stage0)]

`

2006

2064

`pub fn wrapping_shr(self, rhs: u32) -> Self {

`

2007

2065

`self.overflowing_shr(rhs).0

`

2008

2066

`}

`

`@@ -2170,6 +2228,15 @@ macro_rules! uint_impl {

`

2170

2228

```` /// ```


`2171`

`2229`

` #[inline]

`

`2172`

`2230`

` #[stable(feature = "wrapping", since = "1.7.0")]

`

``

`2231`

`+

#[cfg(not(stage0))]

`

``

`2232`

`+

pub fn overflowing_shl(self, rhs: u32) -> (Self, bool) {

`

``

`2233`

`+

(self.wrapping_shl(rhs), (rhs > ($BITS - 1)))

`

``

`2234`

`+

}

`

``

`2235`

`+`

``

`2236`

`+

/// Stage 0

`

``

`2237`

`+

#[inline]

`

``

`2238`

`+

#[stable(feature = "wrapping", since = "1.7.0")]

`

``

`2239`

`+

#[cfg(stage0)]

`

`2173`

`2240`

`pub fn overflowing_shl(self, rhs: u32) -> (Self, bool) {

`

`2174`

`2241`

`(self << (rhs & ($BITS - 1)), (rhs > ($BITS - 1)))

`

`2175`

`2242`

`}

`

`@@ -2192,6 +2259,16 @@ macro_rules! uint_impl {

`

`2192`

`2259`

```` /// ```

2193

2260

` #[inline]

`

2194

2261

` #[stable(feature = "wrapping", since = "1.7.0")]

`

``

2262

`+

#[cfg(not(stage0))]

`

``

2263

`+

pub fn overflowing_shr(self, rhs: u32) -> (Self, bool) {

`

``

2264

`+

(self.wrapping_shr(rhs), (rhs > ($BITS - 1)))

`

``

2265

+

``

2266

`+

}

`

``

2267

+

``

2268

`+

/// Stage 0

`

``

2269

`+

#[inline]

`

``

2270

`+

#[stable(feature = "wrapping", since = "1.7.0")]

`

``

2271

`+

#[cfg(stage0)]

`

2195

2272

`pub fn overflowing_shr(self, rhs: u32) -> (Self, bool) {

`

2196

2273

`(self >> (rhs & ($BITS - 1)), (rhs > ($BITS - 1)))

`

2197

2274

`}

`

`@@ -2292,7 +2369,7 @@ macro_rules! uint_impl {

`

2292

2369

``

2293

2370

`#[lang = "u8"]

`

2294

2371

`impl u8 {

`

2295

``

`-

uint_impl! { u8, 8,

`

``

2372

`+

uint_impl! { u8, u8, 8,

`

2296

2373

` intrinsics::ctpop,

`

2297

2374

` intrinsics::ctlz,

`

2298

2375

` intrinsics::cttz,

`

`@@ -2304,7 +2381,7 @@ impl u8 {

`

2304

2381

``

2305

2382

`#[lang = "u16"]

`

2306

2383

`impl u16 {

`

2307

``

`-

uint_impl! { u16, 16,

`

``

2384

`+

uint_impl! { u16, u16, 16,

`

2308

2385

` intrinsics::ctpop,

`

2309

2386

` intrinsics::ctlz,

`

2310

2387

` intrinsics::cttz,

`

`@@ -2316,7 +2393,7 @@ impl u16 {

`

2316

2393

``

2317

2394

`#[lang = "u32"]

`

2318

2395

`impl u32 {

`

2319

``

`-

uint_impl! { u32, 32,

`

``

2396

`+

uint_impl! { u32, u32, 32,

`

2320

2397

` intrinsics::ctpop,

`

2321

2398

` intrinsics::ctlz,

`

2322

2399

` intrinsics::cttz,

`

`@@ -2328,7 +2405,7 @@ impl u32 {

`

2328

2405

``

2329

2406

`#[lang = "u64"]

`

2330

2407

`impl u64 {

`

2331

``

`-

uint_impl! { u64, 64,

`

``

2408

`+

uint_impl! { u64, u64, 64,

`

2332

2409

` intrinsics::ctpop,

`

2333

2410

` intrinsics::ctlz,

`

2334

2411

` intrinsics::cttz,

`

`@@ -2340,7 +2417,7 @@ impl u64 {

`

2340

2417

``

2341

2418

`#[lang = "u128"]

`

2342

2419

`impl u128 {

`

2343

``

`-

uint_impl! { u128, 128,

`

``

2420

`+

uint_impl! { u128, u128, 128,

`

2344

2421

` intrinsics::ctpop,

`

2345

2422

` intrinsics::ctlz,

`

2346

2423

` intrinsics::cttz,

`

`@@ -2353,7 +2430,7 @@ impl u128 {

`

2353

2430

`#[cfg(target_pointer_width = "16")]

`

2354

2431

`#[lang = "usize"]

`

2355

2432

`impl usize {

`

2356

``

`-

uint_impl! { u16, 16,

`

``

2433

`+

uint_impl! { usize, u16, 16,

`

2357

2434

` intrinsics::ctpop,

`

2358

2435

` intrinsics::ctlz,

`

2359

2436

` intrinsics::cttz,

`

`@@ -2365,7 +2442,7 @@ impl usize {

`

2365

2442

`#[cfg(target_pointer_width = "32")]

`

2366

2443

`#[lang = "usize"]

`

2367

2444

`impl usize {

`

2368

``

`-

uint_impl! { u32, 32,

`

``

2445

`+

uint_impl! { usize, u32, 32,

`

2369

2446

` intrinsics::ctpop,

`

2370

2447

` intrinsics::ctlz,

`

2371

2448

` intrinsics::cttz,

`

`@@ -2378,7 +2455,7 @@ impl usize {

`

2378

2455

`#[cfg(target_pointer_width = "64")]

`

2379

2456

`#[lang = "usize"]

`

2380

2457

`impl usize {

`

2381

``

`-

uint_impl! { u64, 64,

`

``

2458

`+

uint_impl! { usize, u64, 64,

`

2382

2459

` intrinsics::ctpop,

`

2383

2460

` intrinsics::ctlz,

`

2384

2461

` intrinsics::cttz,

`