2929impl Copy for i32 { }
3030impl Copy for i64 { }
3131
32+ #[ repr( C ) ]
33+ pub struct NaturalAlign2 {
34+ a : [ i16 ; 16 ] ,
35+ b : i16 ,
36+ }
37+
38+ #[ repr( C ) ]
39+ #[ repr( align( 4 ) ) ]
40+ pub struct ForceAlign4 {
41+ a : [ i8 ; 16 ] ,
42+ b : i8 ,
43+ }
44+
3245// on i686-windows, this should be passed on stack using `byval`
3346#[ repr( C ) ]
3447pub struct NaturalAlign8 {
@@ -37,7 +50,7 @@ pub struct NaturalAlign8 {
3750 c : i64
3851}
3952
40- // on i686-windows, this should be passed by reference (because the alignment is requested/forced),
53+ // on i686-windows, this is passed by reference (because alignment is >4 and requested/forced),
4154// even though it has the exact same layout as `NaturalAlign8` (!!!)
4255#[ repr( C ) ]
4356#[ repr( align( 8 ) ) ]
@@ -55,6 +68,36 @@ pub struct ForceAlign16 {
5568}
5669
5770extern "C" {
71+ // m68k: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
72+
73+ // wasm: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
74+
75+ // x86_64-linux: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
76+
77+ // x86_64-windows: declare void @natural_align_2(
78+ // x86_64-windows-NOT: byval
79+ // x86_64-windows-SAME: align 2{{.*}})
80+
81+ // i686-linux: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
82+
83+ // i686-windows: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
84+ fn natural_align_2 ( a : NaturalAlign2 ) ;
85+
86+ // m68k: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
87+
88+ // wasm: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
89+
90+ // x86_64-linux: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
91+
92+ // x86_64-windows: declare void @force_align_4(
93+ // x86_64-windows-NOT: byval
94+ // x86_64-windows-SAME: align 4{{.*}})
95+
96+ // i686-linux: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
97+
98+ // i686-windows: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
99+ fn force_align_4 ( b : ForceAlign4 ) ;
100+
58101 // m68k: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}})
59102
60103 // wasm: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 8{{.*}})
@@ -105,7 +148,12 @@ extern "C" {
105148 fn force_align_16 ( z : ForceAlign16 ) ;
106149}
107150
108- pub unsafe fn main ( x : NaturalAlign8 , y : ForceAlign8 , z : ForceAlign16 ) {
151+ pub unsafe fn main (
152+ a : NaturalAlign2 , b : ForceAlign4 ,
153+ x : NaturalAlign8 , y : ForceAlign8 , z : ForceAlign16
154+ ) {
155+ natural_align_2 ( a) ;
156+ force_align_4 ( b) ;
109157 natural_align_8 ( x) ;
110158 force_align_8 ( y) ;
111159 force_align_16 ( z) ;
0 commit comments