//@ revisions:x86-linux x86-darwin //@[x86-linux] compile-flags: --target i686-unknown-linux-gnu //@[x86-linux] needs-llvm-components: x86 //@[x86-darwin] compile-flags: --target i686-apple-darwin //@[x86-darwin] needs-llvm-components: x86 // Tests that aggregates containing vector types get their alignment increased to 16 on Darwin. #![feature(no_core, lang_items, repr_simd, simd_ffi)] #![crate_type = "lib"] #![no_std] #![no_core] #![allow(non_camel_case_types)] #[lang = "sized"] trait Sized {} #[lang = "freeze"] trait Freeze {} #[lang = "copy"] trait Copy {} #[repr(simd)] pub struct i32x4([i32; 4]); #[repr(C)] pub struct Foo { a: i32x4, b: i8, } // This tests that we recursively check for vector types, not just at the top level. #[repr(C)] pub struct DoubleFoo { one: Foo, two: Foo, } extern "C" { // x86-linux: declare void @f({{.*}}byval([32 x i8]) align 4{{.*}}) // x86-darwin: declare void @f({{.*}}byval([32 x i8]) align 16{{.*}}) fn f(foo: Foo); // x86-linux: declare void @g({{.*}}byval([64 x i8]) align 4{{.*}}) // x86-darwin: declare void @g({{.*}}byval([64 x i8]) align 16{{.*}}) fn g(foo: DoubleFoo); } pub fn main() { unsafe { f(Foo { a: i32x4([1, 2, 3, 4]), b: 0 }) } unsafe { g(DoubleFoo { one: Foo { a: i32x4([1, 2, 3, 4]), b: 0 }, two: Foo { a: i32x4([1, 2, 3, 4]), b: 0 }, }) } }