1// RUN: %clang_cc1 -triple lanai-unknown-unknown %s -emit-llvm -o - \
2// RUN:   | FileCheck %s
3
4// Basic argument/attribute tests for Lanai.
5
6// CHECK: define void @f0(i32 inreg %i, i32 inreg %j, i64 inreg %k)
7void f0(int i, long j, long long k) {}
8
9typedef struct {
10  int aa;
11  int bb;
12} s1;
13// CHECK: define void @f1(i32 inreg %i.coerce0, i32 inreg %i.coerce1)
14void f1(s1 i) {}
15
16typedef struct {
17  int cc;
18} s2;
19// CHECK: define void @f2(%struct.s2* noalias sret %agg.result)
20s2 f2() {
21  s2 foo;
22  return foo;
23}
24
25typedef struct {
26  int cc;
27  int dd;
28} s3;
29// CHECK: define void @f3(%struct.s3* noalias sret %agg.result)
30s3 f3() {
31  s3 foo;
32  return foo;
33}
34
35// CHECK: define void @f4(i64 inreg %i)
36void f4(long long i) {}
37
38// CHECK: define void @f5(i8 inreg %a, i16 inreg %b)
39void f5(char a, short b) {}
40
41// CHECK: define void @f6(i8 inreg %a, i16 inreg %b)
42void f6(unsigned char a, unsigned short b) {}
43
44enum my_enum {
45  ENUM1,
46  ENUM2,
47  ENUM3,
48};
49// Enums should be treated as the underlying i32.
50// CHECK: define void @f7(i32 inreg %a)
51void f7(enum my_enum a) {}
52
53enum my_big_enum {
54  ENUM4 = 0xFFFFFFFFFFFFFFFF,
55};
56// Big enums should be treated as the underlying i64.
57// CHECK: define void @f8(i64 inreg %a)
58void f8(enum my_big_enum a) {}
59
60union simple_union {
61  int a;
62  char b;
63};
64// Unions should be passed inreg.
65// CHECK: define void @f9(i32 inreg %s.coerce)
66void f9(union simple_union s) {}
67
68typedef struct {
69  int b4 : 4;
70  int b3 : 3;
71  int b8 : 8;
72} bitfield1;
73// Bitfields should be passed inreg.
74// CHECK: define void @f10(i32 inreg %bf1.coerce)
75void f10(bitfield1 bf1) {}
76