// Tests the correct handling of unnamed fields within structs and unions marked with #[repr(C)]. // EMIT_MIR field_access.foo.SimplifyCfg-initial.after.mir // EMIT_MIR field_access.bar.SimplifyCfg-initial.after.mir #![allow(incomplete_features)] #![feature(unnamed_fields)] #[repr(C)] struct Foo { a: u8, _: struct { b: i8, c: bool, }, _: struct { _: struct { d: [u8; 1], } } } #[repr(C)] union Bar { a: u8, _: union { b: i8, c: bool, }, _: union { _: union { d: [u8; 1], } } } fn access(_: T) {} // CHECK-LABEL: fn foo( fn foo(foo: Foo) { // CHECK [[a:_.*]] = (_1.0: u8); // CHECK _.* = access::(move [[a]]) -> [return: bb1, unwind: bb5]; access(foo.a); // CHECK [[b:_.*]] = ((_1.1: Foo::{anon_adt#0}).0: i8); // CHECK _.* = access::(move [[b]]) -> [return: bb2, unwind: bb5]; access(foo.b); // CHECK [[c:_.*]] = ((_1.1: Foo::{anon_adt#0}).1: bool); // CHECK _.* = access::(move [[c]]) -> [return: bb3, unwind: bb5]; access(foo.c); // CHECK [[d:_.*]] = (((_1.2: Foo::{anon_adt#1}).0: Foo::{anon_adt#1}::{anon_adt#0}).0: [u8; 1]); // CHECK _.* = access::<[u8; 1]>(move [[d]]) -> [return: bb4, unwind: bb5]; access(foo.d); } // CHECK-LABEL: fn bar( fn bar(bar: Bar) { unsafe { // CHECK [[a:_.*]] = (_1.0: u8); // CHECK _.* = access::(move [[a]]) -> [return: bb1, unwind: bb5]; access(bar.a); // CHECK [[b:_.*]] = ((_1.1: Bar::{anon_adt#0}).0: i8); // CHECK _.* = access::(move [[b]]) -> [return: bb2, unwind: bb5]; access(bar.b); // CHECK [[c:_.*]] = ((_1.1: Bar::{anon_adt#0}).1: bool); // CHECK _.* = access::(move [[c]]) -> [return: bb3, unwind: bb5]; access(bar.c); // CHECK [[d:_.*]] = (((_1.2: Bar::{anon_adt#1}).0: Bar::{anon_adt#1}::{anon_adt#0}).0: [u8; 1]); // CHECK _.* = access::<[u8; 1]>(move [[d]]) -> [return: bb4, unwind: bb5]; access(bar.d); } } fn main() {}