Add test for repr(transparent) with scalar
This commit is contained in:
parent
8ecb276735
commit
3c6d1a723d
@ -614,7 +614,7 @@ fn register_with_filter<'tcx>(
|
||||
}
|
||||
}
|
||||
|
||||
/// Register fields of the given (local, projection) place.
|
||||
/// Potentially register the (local, projection) place and its fields, recursively.
|
||||
///
|
||||
/// Invariant: The projection must only contain fields.
|
||||
fn register_with_filter_rec<'tcx>(
|
||||
@ -626,13 +626,16 @@ fn register_with_filter_rec<'tcx>(
|
||||
filter: &mut impl FnMut(Ty<'tcx>) -> bool,
|
||||
exclude: &FxHashSet<Place<'tcx>>,
|
||||
) {
|
||||
if exclude.contains(&Place { local, projection: tcx.intern_place_elems(projection) }) {
|
||||
let place = Place { local, projection: tcx.intern_place_elems(projection) };
|
||||
if exclude.contains(&place) {
|
||||
// This will also exclude all projections of the excluded place.
|
||||
return;
|
||||
}
|
||||
|
||||
// Note: The framework supports only scalars for now.
|
||||
if filter(ty) && ty.is_scalar() {
|
||||
trace!("registering place: {:?}", place);
|
||||
|
||||
// We know that the projection only contains trackable elements.
|
||||
let place = self.make_place(local, projection).unwrap();
|
||||
|
||||
|
@ -0,0 +1,44 @@
|
||||
- // MIR for `main` before DataflowConstProp
|
||||
+ // MIR for `main` after DataflowConstProp
|
||||
|
||||
fn main() -> () {
|
||||
let mut _0: (); // return place in scope 0 at $DIR/repr_transparent.rs:+0:11: +0:11
|
||||
let _1: I32; // in scope 0 at $DIR/repr_transparent.rs:+1:9: +1:10
|
||||
let mut _3: i32; // in scope 0 at $DIR/repr_transparent.rs:+2:17: +2:26
|
||||
let mut _4: i32; // in scope 0 at $DIR/repr_transparent.rs:+2:17: +2:20
|
||||
let mut _5: i32; // in scope 0 at $DIR/repr_transparent.rs:+2:23: +2:26
|
||||
scope 1 {
|
||||
debug x => _1; // in scope 1 at $DIR/repr_transparent.rs:+1:9: +1:10
|
||||
let _2: I32; // in scope 1 at $DIR/repr_transparent.rs:+2:9: +2:10
|
||||
scope 2 {
|
||||
debug y => _2; // in scope 2 at $DIR/repr_transparent.rs:+2:9: +2:10
|
||||
}
|
||||
}
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1); // scope 0 at $DIR/repr_transparent.rs:+1:9: +1:10
|
||||
Deinit(_1); // scope 0 at $DIR/repr_transparent.rs:+1:13: +1:19
|
||||
(_1.0: i32) = const 0_i32; // scope 0 at $DIR/repr_transparent.rs:+1:13: +1:19
|
||||
StorageLive(_2); // scope 1 at $DIR/repr_transparent.rs:+2:9: +2:10
|
||||
StorageLive(_3); // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:26
|
||||
StorageLive(_4); // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:20
|
||||
- _4 = (_1.0: i32); // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:20
|
||||
+ _4 = const 0_i32; // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:20
|
||||
StorageLive(_5); // scope 1 at $DIR/repr_transparent.rs:+2:23: +2:26
|
||||
- _5 = (_1.0: i32); // scope 1 at $DIR/repr_transparent.rs:+2:23: +2:26
|
||||
- _3 = Add(move _4, move _5); // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:26
|
||||
+ _5 = const 0_i32; // scope 1 at $DIR/repr_transparent.rs:+2:23: +2:26
|
||||
+ _3 = const 0_i32; // scope 1 at $DIR/repr_transparent.rs:+2:17: +2:26
|
||||
StorageDead(_5); // scope 1 at $DIR/repr_transparent.rs:+2:25: +2:26
|
||||
StorageDead(_4); // scope 1 at $DIR/repr_transparent.rs:+2:25: +2:26
|
||||
Deinit(_2); // scope 1 at $DIR/repr_transparent.rs:+2:13: +2:27
|
||||
- (_2.0: i32) = move _3; // scope 1 at $DIR/repr_transparent.rs:+2:13: +2:27
|
||||
+ (_2.0: i32) = const 0_i32; // scope 1 at $DIR/repr_transparent.rs:+2:13: +2:27
|
||||
StorageDead(_3); // scope 1 at $DIR/repr_transparent.rs:+2:26: +2:27
|
||||
_0 = const (); // scope 0 at $DIR/repr_transparent.rs:+0:11: +3:2
|
||||
StorageDead(_2); // scope 1 at $DIR/repr_transparent.rs:+3:1: +3:2
|
||||
StorageDead(_1); // scope 0 at $DIR/repr_transparent.rs:+3:1: +3:2
|
||||
return; // scope 0 at $DIR/repr_transparent.rs:+3:2: +3:2
|
||||
}
|
||||
}
|
||||
|
12
src/test/mir-opt/dataflow-const-prop/repr_transparent.rs
Normal file
12
src/test/mir-opt/dataflow-const-prop/repr_transparent.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// unit-test: DataflowConstProp
|
||||
|
||||
// The struct has scalar ABI, but is not a scalar type.
|
||||
// Make sure that we handle this correctly.
|
||||
#[repr(transparent)]
|
||||
struct I32(i32);
|
||||
|
||||
// EMIT_MIR repr_transparent.main.DataflowConstProp.diff
|
||||
fn main() {
|
||||
let x = I32(0);
|
||||
let y = I32(x.0 + x.0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user