Rollup merge of #124484 - GKFX:offset_of_must_use, r=jieyouxu
Fix #124478 - offset_of! returns a temporary This was due to the must_use() call. Adding HIR's `OffsetOf` to the must_use checking within the compiler avoids this issue while maintaining the lint output. Fixes #124478. `@tgross35`
This commit is contained in:
commit
0580588ec6
@ -176,6 +176,7 @@ fn check_stmt(&mut self, cx: &LateContext<'_>, s: &hir::Stmt<'_>) {
|
||||
| hir::BinOpKind::Shr => Some("bitwise operation"),
|
||||
},
|
||||
hir::ExprKind::AddrOf(..) => Some("borrow"),
|
||||
hir::ExprKind::OffsetOf(..) => Some("`offset_of` call"),
|
||||
hir::ExprKind::Unary(..) => Some("unary operation"),
|
||||
_ => None,
|
||||
};
|
||||
|
@ -1340,8 +1340,8 @@ impl<T> SizedTypeProperties for T {}
|
||||
/// assert_eq!(mem::offset_of!(Option<&u8>, Some.0), 0);
|
||||
/// ```
|
||||
#[stable(feature = "offset_of", since = "1.77.0")]
|
||||
#[allow_internal_unstable(builtin_syntax, hint_must_use)]
|
||||
#[allow_internal_unstable(builtin_syntax)]
|
||||
pub macro offset_of($Container:ty, $($fields:expr)+ $(,)?) {
|
||||
// The `{}` is for better error messages
|
||||
crate::hint::must_use({builtin # offset_of($Container, $($fields)+)})
|
||||
{builtin # offset_of($Container, $($fields)+)}
|
||||
}
|
||||
|
@ -4,33 +4,26 @@
|
||||
fn concrete() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
let mut _10: usize;
|
||||
let mut _12: usize;
|
||||
let mut _14: usize;
|
||||
scope 1 {
|
||||
debug x => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug y => _3;
|
||||
let _5: usize;
|
||||
debug y => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug z0 => _5;
|
||||
let _7: usize;
|
||||
debug z0 => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug z1 => _7;
|
||||
let _9: usize;
|
||||
debug z1 => _4;
|
||||
let _5: usize;
|
||||
scope 5 {
|
||||
debug eA0 => _9;
|
||||
let _11: usize;
|
||||
debug eA0 => _5;
|
||||
let _6: usize;
|
||||
scope 6 {
|
||||
debug eA1 => _11;
|
||||
let _13: usize;
|
||||
debug eA1 => _6;
|
||||
let _7: usize;
|
||||
scope 7 {
|
||||
debug eC => _13;
|
||||
debug eC => _7;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -41,82 +34,33 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
- _1 = OffsetOf(Alpha, [(0, 0)]);
|
||||
+ _1 = const 4_usize;
|
||||
StorageLive(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 0)]);
|
||||
- _1 = must_use::<usize>(move _2) -> [return: bb1, unwind unreachable];
|
||||
+ _2 = const 4_usize;
|
||||
+ _1 = must_use::<usize>(const 4_usize) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 1)]);
|
||||
+ _2 = const 0_usize;
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
+ _3 = const 2_usize;
|
||||
StorageLive(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 1)]);
|
||||
- _3 = must_use::<usize>(move _4) -> [return: bb2, unwind unreachable];
|
||||
+ _4 = const 0_usize;
|
||||
+ _3 = must_use::<usize>(const 0_usize) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
+ _4 = const 3_usize;
|
||||
StorageLive(_5);
|
||||
- _5 = OffsetOf(Epsilon, [(0, 0)]);
|
||||
+ _5 = const 1_usize;
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind unreachable];
|
||||
- _6 = OffsetOf(Epsilon, [(0, 1)]);
|
||||
+ _6 = const 2_usize;
|
||||
+ _5 = must_use::<usize>(const 2_usize) -> [return: bb3, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind unreachable];
|
||||
+ _8 = const 3_usize;
|
||||
+ _7 = must_use::<usize>(const 3_usize) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
StorageLive(_9);
|
||||
StorageLive(_10);
|
||||
- _10 = OffsetOf(Epsilon, [(0, 0)]);
|
||||
- _9 = must_use::<usize>(move _10) -> [return: bb5, unwind unreachable];
|
||||
+ _10 = const 1_usize;
|
||||
+ _9 = must_use::<usize>(const 1_usize) -> [return: bb5, unwind unreachable];
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageDead(_10);
|
||||
StorageLive(_11);
|
||||
StorageLive(_12);
|
||||
- _12 = OffsetOf(Epsilon, [(0, 1)]);
|
||||
- _11 = must_use::<usize>(move _12) -> [return: bb6, unwind unreachable];
|
||||
+ _12 = const 2_usize;
|
||||
+ _11 = must_use::<usize>(const 2_usize) -> [return: bb6, unwind unreachable];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_12);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
- _14 = OffsetOf(Epsilon, [(2, 0)]);
|
||||
- _13 = must_use::<usize>(move _14) -> [return: bb7, unwind unreachable];
|
||||
+ _14 = const 4_usize;
|
||||
+ _13 = must_use::<usize>(const 4_usize) -> [return: bb7, unwind unreachable];
|
||||
}
|
||||
|
||||
bb7: {
|
||||
StorageDead(_14);
|
||||
- _7 = OffsetOf(Epsilon, [(2, 0)]);
|
||||
+ _7 = const 4_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_13);
|
||||
StorageDead(_11);
|
||||
StorageDead(_9);
|
||||
StorageDead(_7);
|
||||
StorageDead(_6);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,33 +4,26 @@
|
||||
fn concrete() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
let mut _10: usize;
|
||||
let mut _12: usize;
|
||||
let mut _14: usize;
|
||||
scope 1 {
|
||||
debug x => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug y => _3;
|
||||
let _5: usize;
|
||||
debug y => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug z0 => _5;
|
||||
let _7: usize;
|
||||
debug z0 => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug z1 => _7;
|
||||
let _9: usize;
|
||||
debug z1 => _4;
|
||||
let _5: usize;
|
||||
scope 5 {
|
||||
debug eA0 => _9;
|
||||
let _11: usize;
|
||||
debug eA0 => _5;
|
||||
let _6: usize;
|
||||
scope 6 {
|
||||
debug eA1 => _11;
|
||||
let _13: usize;
|
||||
debug eA1 => _6;
|
||||
let _7: usize;
|
||||
scope 7 {
|
||||
debug eC => _13;
|
||||
debug eC => _7;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -41,82 +34,33 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
- _1 = OffsetOf(Alpha, [(0, 0)]);
|
||||
+ _1 = const 4_usize;
|
||||
StorageLive(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 0)]);
|
||||
- _1 = must_use::<usize>(move _2) -> [return: bb1, unwind continue];
|
||||
+ _2 = const 4_usize;
|
||||
+ _1 = must_use::<usize>(const 4_usize) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 1)]);
|
||||
+ _2 = const 0_usize;
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
+ _3 = const 2_usize;
|
||||
StorageLive(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 1)]);
|
||||
- _3 = must_use::<usize>(move _4) -> [return: bb2, unwind continue];
|
||||
+ _4 = const 0_usize;
|
||||
+ _3 = must_use::<usize>(const 0_usize) -> [return: bb2, unwind continue];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
+ _4 = const 3_usize;
|
||||
StorageLive(_5);
|
||||
- _5 = OffsetOf(Epsilon, [(0, 0)]);
|
||||
+ _5 = const 1_usize;
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind continue];
|
||||
- _6 = OffsetOf(Epsilon, [(0, 1)]);
|
||||
+ _6 = const 2_usize;
|
||||
+ _5 = must_use::<usize>(const 2_usize) -> [return: bb3, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind continue];
|
||||
+ _8 = const 3_usize;
|
||||
+ _7 = must_use::<usize>(const 3_usize) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
StorageLive(_9);
|
||||
StorageLive(_10);
|
||||
- _10 = OffsetOf(Epsilon, [(0, 0)]);
|
||||
- _9 = must_use::<usize>(move _10) -> [return: bb5, unwind continue];
|
||||
+ _10 = const 1_usize;
|
||||
+ _9 = must_use::<usize>(const 1_usize) -> [return: bb5, unwind continue];
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageDead(_10);
|
||||
StorageLive(_11);
|
||||
StorageLive(_12);
|
||||
- _12 = OffsetOf(Epsilon, [(0, 1)]);
|
||||
- _11 = must_use::<usize>(move _12) -> [return: bb6, unwind continue];
|
||||
+ _12 = const 2_usize;
|
||||
+ _11 = must_use::<usize>(const 2_usize) -> [return: bb6, unwind continue];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_12);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
- _14 = OffsetOf(Epsilon, [(2, 0)]);
|
||||
- _13 = must_use::<usize>(move _14) -> [return: bb7, unwind continue];
|
||||
+ _14 = const 4_usize;
|
||||
+ _13 = must_use::<usize>(const 4_usize) -> [return: bb7, unwind continue];
|
||||
}
|
||||
|
||||
bb7: {
|
||||
StorageDead(_14);
|
||||
- _7 = OffsetOf(Epsilon, [(2, 0)]);
|
||||
+ _7 = const 4_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_13);
|
||||
StorageDead(_11);
|
||||
StorageDead(_9);
|
||||
StorageDead(_7);
|
||||
StorageDead(_6);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,33 +4,26 @@
|
||||
fn generic() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
let mut _10: usize;
|
||||
let mut _12: usize;
|
||||
let mut _14: usize;
|
||||
scope 1 {
|
||||
debug gx => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug gy => _3;
|
||||
let _5: usize;
|
||||
debug gy => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug dx => _5;
|
||||
let _7: usize;
|
||||
debug dx => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug dy => _7;
|
||||
let _9: usize;
|
||||
debug dy => _4;
|
||||
let _5: usize;
|
||||
scope 5 {
|
||||
debug zA0 => _9;
|
||||
let _11: usize;
|
||||
debug zA0 => _5;
|
||||
let _6: usize;
|
||||
scope 6 {
|
||||
debug zA1 => _11;
|
||||
let _13: usize;
|
||||
debug zA1 => _6;
|
||||
let _7: usize;
|
||||
scope 7 {
|
||||
debug zB => _13;
|
||||
debug zB => _7;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -41,72 +34,28 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
_1 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
StorageLive(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
_1 = must_use::<usize>(move _2) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
+ _3 = const 0_usize;
|
||||
StorageLive(_4);
|
||||
_4 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
_3 = must_use::<usize>(move _4) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
- _4 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
+ _4 = const 2_usize;
|
||||
StorageLive(_5);
|
||||
_5 = OffsetOf(Zeta<T>, [(0, 0)]);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind unreachable];
|
||||
+ _6 = const 0_usize;
|
||||
+ _5 = must_use::<usize>(const 0_usize) -> [return: bb3, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
_6 = OffsetOf(Zeta<T>, [(0, 1)]);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind unreachable];
|
||||
+ _8 = const 2_usize;
|
||||
+ _7 = must_use::<usize>(const 2_usize) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
StorageLive(_9);
|
||||
StorageLive(_10);
|
||||
_10 = OffsetOf(Zeta<T>, [(0, 0)]);
|
||||
_9 = must_use::<usize>(move _10) -> [return: bb5, unwind unreachable];
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageDead(_10);
|
||||
StorageLive(_11);
|
||||
StorageLive(_12);
|
||||
_12 = OffsetOf(Zeta<T>, [(0, 1)]);
|
||||
_11 = must_use::<usize>(move _12) -> [return: bb6, unwind unreachable];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_12);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
_14 = OffsetOf(Zeta<T>, [(1, 0)]);
|
||||
_13 = must_use::<usize>(move _14) -> [return: bb7, unwind unreachable];
|
||||
}
|
||||
|
||||
bb7: {
|
||||
StorageDead(_14);
|
||||
_7 = OffsetOf(Zeta<T>, [(1, 0)]);
|
||||
_0 = const ();
|
||||
StorageDead(_13);
|
||||
StorageDead(_11);
|
||||
StorageDead(_9);
|
||||
StorageDead(_7);
|
||||
StorageDead(_6);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,33 +4,26 @@
|
||||
fn generic() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
let mut _10: usize;
|
||||
let mut _12: usize;
|
||||
let mut _14: usize;
|
||||
scope 1 {
|
||||
debug gx => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug gy => _3;
|
||||
let _5: usize;
|
||||
debug gy => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug dx => _5;
|
||||
let _7: usize;
|
||||
debug dx => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug dy => _7;
|
||||
let _9: usize;
|
||||
debug dy => _4;
|
||||
let _5: usize;
|
||||
scope 5 {
|
||||
debug zA0 => _9;
|
||||
let _11: usize;
|
||||
debug zA0 => _5;
|
||||
let _6: usize;
|
||||
scope 6 {
|
||||
debug zA1 => _11;
|
||||
let _13: usize;
|
||||
debug zA1 => _6;
|
||||
let _7: usize;
|
||||
scope 7 {
|
||||
debug zB => _13;
|
||||
debug zB => _7;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -41,72 +34,28 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
_1 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
StorageLive(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
_1 = must_use::<usize>(move _2) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
+ _3 = const 0_usize;
|
||||
StorageLive(_4);
|
||||
_4 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
_3 = must_use::<usize>(move _4) -> [return: bb2, unwind continue];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
- _4 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
+ _4 = const 2_usize;
|
||||
StorageLive(_5);
|
||||
_5 = OffsetOf(Zeta<T>, [(0, 0)]);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind continue];
|
||||
+ _6 = const 0_usize;
|
||||
+ _5 = must_use::<usize>(const 0_usize) -> [return: bb3, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
_6 = OffsetOf(Zeta<T>, [(0, 1)]);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind continue];
|
||||
+ _8 = const 2_usize;
|
||||
+ _7 = must_use::<usize>(const 2_usize) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
StorageLive(_9);
|
||||
StorageLive(_10);
|
||||
_10 = OffsetOf(Zeta<T>, [(0, 0)]);
|
||||
_9 = must_use::<usize>(move _10) -> [return: bb5, unwind continue];
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageDead(_10);
|
||||
StorageLive(_11);
|
||||
StorageLive(_12);
|
||||
_12 = OffsetOf(Zeta<T>, [(0, 1)]);
|
||||
_11 = must_use::<usize>(move _12) -> [return: bb6, unwind continue];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_12);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
_14 = OffsetOf(Zeta<T>, [(1, 0)]);
|
||||
_13 = must_use::<usize>(move _14) -> [return: bb7, unwind continue];
|
||||
}
|
||||
|
||||
bb7: {
|
||||
StorageDead(_14);
|
||||
_7 = OffsetOf(Zeta<T>, [(1, 0)]);
|
||||
_0 = const ();
|
||||
StorageDead(_13);
|
||||
StorageDead(_11);
|
||||
StorageDead(_9);
|
||||
StorageDead(_7);
|
||||
StorageDead(_6);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,21 +4,17 @@
|
||||
fn concrete() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
scope 1 {
|
||||
debug x => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug y => _3;
|
||||
let _5: usize;
|
||||
debug y => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug z0 => _5;
|
||||
let _7: usize;
|
||||
debug z0 => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug z1 => _7;
|
||||
debug z1 => _4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -26,49 +22,21 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
- _1 = OffsetOf(Alpha, [(0, 0)]);
|
||||
+ _1 = const 4_usize;
|
||||
StorageLive(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 0)]);
|
||||
- _1 = must_use::<usize>(move _2) -> [return: bb1, unwind unreachable];
|
||||
+ _2 = const 4_usize;
|
||||
+ _1 = must_use::<usize>(const 4_usize) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 1)]);
|
||||
+ _2 = const 0_usize;
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
+ _3 = const 2_usize;
|
||||
StorageLive(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 1)]);
|
||||
- _3 = must_use::<usize>(move _4) -> [return: bb2, unwind unreachable];
|
||||
+ _4 = const 0_usize;
|
||||
+ _3 = must_use::<usize>(const 0_usize) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind unreachable];
|
||||
+ _6 = const 2_usize;
|
||||
+ _5 = must_use::<usize>(const 2_usize) -> [return: bb3, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind unreachable];
|
||||
+ _8 = const 3_usize;
|
||||
+ _7 = must_use::<usize>(const 3_usize) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
- _4 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
+ _4 = const 3_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_7);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,21 +4,17 @@
|
||||
fn concrete() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
scope 1 {
|
||||
debug x => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug y => _3;
|
||||
let _5: usize;
|
||||
debug y => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug z0 => _5;
|
||||
let _7: usize;
|
||||
debug z0 => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug z1 => _7;
|
||||
debug z1 => _4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -26,49 +22,21 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
- _1 = OffsetOf(Alpha, [(0, 0)]);
|
||||
+ _1 = const 4_usize;
|
||||
StorageLive(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 0)]);
|
||||
- _1 = must_use::<usize>(move _2) -> [return: bb1, unwind continue];
|
||||
+ _2 = const 4_usize;
|
||||
+ _1 = must_use::<usize>(const 4_usize) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
- _2 = OffsetOf(Alpha, [(0, 1)]);
|
||||
+ _2 = const 0_usize;
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
+ _3 = const 2_usize;
|
||||
StorageLive(_4);
|
||||
- _4 = OffsetOf(Alpha, [(0, 1)]);
|
||||
- _3 = must_use::<usize>(move _4) -> [return: bb2, unwind continue];
|
||||
+ _4 = const 0_usize;
|
||||
+ _3 = must_use::<usize>(const 0_usize) -> [return: bb2, unwind continue];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Alpha, [(0, 2), (0, 0)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind continue];
|
||||
+ _6 = const 2_usize;
|
||||
+ _5 = must_use::<usize>(const 2_usize) -> [return: bb3, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind continue];
|
||||
+ _8 = const 3_usize;
|
||||
+ _7 = must_use::<usize>(const 3_usize) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
- _4 = OffsetOf(Alpha, [(0, 2), (0, 1)]);
|
||||
+ _4 = const 3_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_7);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,21 +4,17 @@
|
||||
fn generic() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
scope 1 {
|
||||
debug gx => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug gy => _3;
|
||||
let _5: usize;
|
||||
debug gy => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug dx => _5;
|
||||
let _7: usize;
|
||||
debug dx => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug dy => _7;
|
||||
debug dy => _4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -26,45 +22,19 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
_1 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
StorageLive(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
_1 = must_use::<usize>(move _2) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
+ _3 = const 0_usize;
|
||||
StorageLive(_4);
|
||||
_4 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
_3 = must_use::<usize>(move _4) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind unreachable];
|
||||
+ _6 = const 0_usize;
|
||||
+ _5 = must_use::<usize>(const 0_usize) -> [return: bb3, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind unreachable];
|
||||
+ _8 = const 2_usize;
|
||||
+ _7 = must_use::<usize>(const 2_usize) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
- _4 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
+ _4 = const 2_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_7);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -4,21 +4,17 @@
|
||||
fn generic() -> () {
|
||||
let mut _0: ();
|
||||
let _1: usize;
|
||||
let mut _2: usize;
|
||||
let mut _4: usize;
|
||||
let mut _6: usize;
|
||||
let mut _8: usize;
|
||||
scope 1 {
|
||||
debug gx => _1;
|
||||
let _3: usize;
|
||||
let _2: usize;
|
||||
scope 2 {
|
||||
debug gy => _3;
|
||||
let _5: usize;
|
||||
debug gy => _2;
|
||||
let _3: usize;
|
||||
scope 3 {
|
||||
debug dx => _5;
|
||||
let _7: usize;
|
||||
debug dx => _3;
|
||||
let _4: usize;
|
||||
scope 4 {
|
||||
debug dy => _7;
|
||||
debug dy => _4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -26,45 +22,19 @@
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
_1 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
StorageLive(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
_1 = must_use::<usize>(move _2) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2);
|
||||
_2 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
StorageLive(_3);
|
||||
- _3 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
+ _3 = const 0_usize;
|
||||
StorageLive(_4);
|
||||
_4 = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
_3 = must_use::<usize>(move _4) -> [return: bb2, unwind continue];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
- _6 = OffsetOf(Delta<T>, [(0, 1)]);
|
||||
- _5 = must_use::<usize>(move _6) -> [return: bb3, unwind continue];
|
||||
+ _6 = const 0_usize;
|
||||
+ _5 = must_use::<usize>(const 0_usize) -> [return: bb3, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_6);
|
||||
StorageLive(_7);
|
||||
StorageLive(_8);
|
||||
- _8 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
- _7 = must_use::<usize>(move _8) -> [return: bb4, unwind continue];
|
||||
+ _8 = const 2_usize;
|
||||
+ _7 = must_use::<usize>(const 2_usize) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_8);
|
||||
- _4 = OffsetOf(Delta<T>, [(0, 2)]);
|
||||
+ _4 = const 2_usize;
|
||||
_0 = const ();
|
||||
StorageDead(_7);
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageDead(_3);
|
||||
StorageDead(_2);
|
||||
StorageDead(_1);
|
||||
return;
|
||||
}
|
||||
|
@ -36,16 +36,16 @@ fn concrete() {
|
||||
// CHECK: debug z0 => [[z0:_.*]];
|
||||
// CHECK: debug z1 => [[z1:_.*]];
|
||||
|
||||
// CHECK: [[x]] = must_use::<usize>(const 4_usize) -> {{.*}}
|
||||
// CHECK: [[x]] = const 4_usize
|
||||
let x = offset_of!(Alpha, x);
|
||||
|
||||
// CHECK: [[y]] = must_use::<usize>(const 0_usize) -> {{.*}}
|
||||
// CHECK: [[y]] = const 0_usize
|
||||
let y = offset_of!(Alpha, y);
|
||||
|
||||
// CHECK: [[z0]] = must_use::<usize>(const 2_usize) -> {{.*}}
|
||||
// CHECK: [[z0]] = const 2_usize
|
||||
let z0 = offset_of!(Alpha, z.0);
|
||||
|
||||
// CHECK: [[z1]] = must_use::<usize>(const 3_usize) -> {{.*}}
|
||||
// CHECK: [[z1]] = const 3_usize
|
||||
let z1 = offset_of!(Alpha, z.1);
|
||||
}
|
||||
|
||||
@ -58,16 +58,16 @@ fn generic<T>() {
|
||||
// CHECK: debug dx => [[dx:_.*]];
|
||||
// CHECK: debug dy => [[dy:_.*]];
|
||||
|
||||
// CHECK: [[gx]] = must_use::<usize>(move {{_.*}}) -> {{.*}}
|
||||
// CHECK: [[gx]] = OffsetOf(Gamma<T>, [(0, 0)]);
|
||||
let gx = offset_of!(Gamma<T>, x);
|
||||
|
||||
// CHECK: [[gy]] = must_use::<usize>(move {{_.*}}) -> {{.*}}
|
||||
// CHECK: [[gy]] = OffsetOf(Gamma<T>, [(0, 1)]);
|
||||
let gy = offset_of!(Gamma<T>, y);
|
||||
|
||||
// CHECK: [[dx]] = must_use::<usize>(const 0_usize) -> {{.*}}
|
||||
// CHECK: [[dx]] = const 0_usize
|
||||
let dx = offset_of!(Delta<T>, x);
|
||||
|
||||
// CHECK: [[dy]] = must_use::<usize>(const 2_usize) -> {{.*}}
|
||||
// CHECK: [[dy]] = const 2_usize
|
||||
let dy = offset_of!(Delta<T>, y);
|
||||
}
|
||||
|
||||
|
@ -34,20 +34,6 @@ LL | offset_of!((u8, dyn Trait), 1);
|
||||
= help: the trait `Sized` is not implemented for `dyn Trait`
|
||||
= note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/offset-of-dst-field.rs:44:5
|
||||
|
|
||||
LL | offset_of!(Delta<Alpha>, z);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `Alpha`, the trait `Sized` is not implemented for `[u8]`, which is required by `Alpha: Sized`
|
||||
note: required because it appears within the type `Alpha`
|
||||
--> $DIR/offset-of-dst-field.rs:5:8
|
||||
|
|
||||
LL | struct Alpha {
|
||||
| ^^^^^
|
||||
= note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `Extern` cannot be known at compilation time
|
||||
--> $DIR/offset-of-dst-field.rs:45:5
|
||||
|
|
||||
@ -66,6 +52,20 @@ LL | offset_of!(Delta<dyn Trait>, z);
|
||||
= help: the trait `Sized` is not implemented for `dyn Trait`
|
||||
= note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/offset-of-dst-field.rs:44:5
|
||||
|
|
||||
LL | offset_of!(Delta<Alpha>, z);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `Alpha`, the trait `Sized` is not implemented for `[u8]`, which is required by `Alpha: Sized`
|
||||
note: required because it appears within the type `Alpha`
|
||||
--> $DIR/offset-of-dst-field.rs:5:8
|
||||
|
|
||||
LL | struct Alpha {
|
||||
| ^^^^^
|
||||
= note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `T` cannot be known at compilation time
|
||||
--> $DIR/offset-of-dst-field.rs:50:5
|
||||
|
|
||||
|
@ -4,5 +4,5 @@
|
||||
|
||||
fn main() {
|
||||
core::mem::offset_of!((String,), 0);
|
||||
//~^ WARN unused return value of `must_use` that must be used
|
||||
//~^ WARN unused `offset_of` call that must be used
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
warning: unused return value of `must_use` that must be used
|
||||
warning: unused `offset_of` call that must be used
|
||||
--> $DIR/offset-of-must-use.rs:6:5
|
||||
|
|
||||
LL | core::mem::offset_of!((String,), 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the `offset_of` call produces a value
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/offset-of-must-use.rs:3:9
|
||||
|
23
tests/ui/offset-of/offset-of-temporaries.rs
Normal file
23
tests/ui/offset-of/offset-of-temporaries.rs
Normal file
@ -0,0 +1,23 @@
|
||||
//@ build-pass
|
||||
|
||||
//! Regression test #124478.
|
||||
|
||||
use std::mem::offset_of;
|
||||
|
||||
struct S {
|
||||
v: u8,
|
||||
w: u16,
|
||||
}
|
||||
|
||||
impl S {
|
||||
fn return_static_slice() -> &'static [usize] {
|
||||
&[offset_of!(Self, v), offset_of!(Self, w)]
|
||||
}
|
||||
fn use_reference() -> usize {
|
||||
let r = &offset_of!(Self, v);
|
||||
*r * 6
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
Loading…
Reference in New Issue
Block a user