1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li
4*67e74705SXin Li // CHECK: _Z3fooRi(i32* inreg
foo(int & a)5*67e74705SXin Li void __attribute__ ((regparm (1))) foo(int &a) {
6*67e74705SXin Li }
7*67e74705SXin Li
8*67e74705SXin Li struct S1 {
9*67e74705SXin Li int x;
10*67e74705SXin Li S1(const S1 &y);
11*67e74705SXin Li };
12*67e74705SXin Li
13*67e74705SXin Li void __attribute__((regparm(3))) foo2(S1 a, int b);
14*67e74705SXin Li // CHECK: declare void @_Z4foo22S1i(%struct.S1* inreg, i32 inreg)
bar2(S1 a,int b)15*67e74705SXin Li void bar2(S1 a, int b) {
16*67e74705SXin Li foo2(a, b);
17*67e74705SXin Li }
18*67e74705SXin Li
19*67e74705SXin Li struct S2 {
20*67e74705SXin Li int x;
21*67e74705SXin Li };
22*67e74705SXin Li
23*67e74705SXin Li void __attribute__((regparm(3))) foo3(struct S2 a, int b);
24*67e74705SXin Li // CHECK: declare void @_Z4foo32S2i(i32 inreg, i32 inreg)
bar3(struct S2 a,int b)25*67e74705SXin Li void bar3(struct S2 a, int b) {
26*67e74705SXin Li foo3(a, b);
27*67e74705SXin Li }
28*67e74705SXin Li
29*67e74705SXin Li struct S3 {
30*67e74705SXin Li struct {
31*67e74705SXin Li struct {} b[0];
32*67e74705SXin Li } a;
33*67e74705SXin Li };
34*67e74705SXin Li __attribute((regparm(2))) void foo4(S3 a, int b);
35*67e74705SXin Li // CHECK: declare void @_Z4foo42S3i(%struct.S3* byval align 4, i32 inreg)
bar3(S3 a,int b)36*67e74705SXin Li void bar3(S3 a, int b) {
37*67e74705SXin Li foo4(a, b);
38*67e74705SXin Li }
39