More C ABI questions with Clang

1. In x86 it seems like a lost opportunity not to lower a union like

union Foo
{
  char x;
  int y;
  float z;
};

To a float, since

struct Foo
{
   float z;
}

would be. Is it just an omission or what?

2. Is this ABI lowering reasonable on x64? Doesn’t the bitcast and consequent i64 load strictly speaking load things beyond the end of struct Foo as allocated in a?

struct Foo
{
  int a;
  char b;
};

struct Foo getFoo(int x)
{
  struct Foo a;
  return a;
}

To

%struct.Foo = type { i32, i8 }

define dso_local i64 @getFoo(i32 %0) #0 !dbg !7 {
  %2 = alloca %struct.Foo, align 4
  %3 = alloca i32, align 4
  store i32 %0, i32* %3, align 4
  %4 = bitcast %struct.Foo* %2 to i64*, !dbg !21
  %5 = load i64, i64* %4, align 4, !dbg !21
  ret i64 %5, !dbg !21
}

/Christoffer