Add test for repr(transparent) with scalar

This commit is contained in:
Jannis Christopher Köhl 2022-11-11 11:24:31 +01:00
parent 8ecb276735
commit 3c6d1a723d
3 changed files with 61 additions and 2 deletions

View File

@ -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();

View File

@ -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
}
}

View 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);
}