15d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// This verifies that structs returned from functions by value are passed
25d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// correctly according to their attributes and the ABI.
35d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// SEE: PR3835
45d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer
55d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
60ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar
70ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbartypedef int T0;
80ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbartypedef struct { int a[16]; } T1;
90ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar
100ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel DunbarT0 __attribute__((const)) f0(void);
110ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel DunbarT0 __attribute__((pure)) f1(void);
120ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel DunbarT1 __attribute__((const)) f2(void);
130ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel DunbarT1 __attribute__((pure)) f3(void);
140ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbarvoid __attribute__((const)) f4(T1 a);
150ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbarvoid __attribute__((pure)) f5(T1 a);
160ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar
170ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbarvoid *ps[] = { f0, f1, f2, f3, f4, f5 };
185d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer
19c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: declare i32 @f0() [[RN:#[0-9]+]]
20c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: declare i32 @f1() [[RO:#[0-9]+]]
215d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// CHECK: declare void @f2({{.*}} sret)
225d058e7f64d51f195128cdb13ef0d50df3161218Michael J. Spencer// CHECK: declare void @f3({{.*}} sret)
23c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @f4({{.*}} byval align 4)
24c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @f5({{.*}} byval align 4)
25f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
26c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[RN]] = { nounwind readnone{{.*}} }
27c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[RO]] = { nounwind readonly{{.*}} }
28