1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li // PR15768
4*67e74705SXin Li
5*67e74705SXin Li // A trivial 20 byte struct is returned indirectly and taken as byval.
6*67e74705SXin Li struct S {
7*67e74705SXin Li S();
8*67e74705SXin Li int a, b, c, d, e;
9*67e74705SXin Li };
10*67e74705SXin Li
11*67e74705SXin Li struct C {
12*67e74705SXin Li S variadic_sret(const char *f, ...);
13*67e74705SXin Li S __cdecl cdecl_sret();
14*67e74705SXin Li S __cdecl byval_and_sret(S a);
15*67e74705SXin Li int c;
16*67e74705SXin Li };
17*67e74705SXin Li
variadic_sret(const char * f,...)18*67e74705SXin Li S C::variadic_sret(const char *f, ...) { return S(); }
cdecl_sret()19*67e74705SXin Li S C::cdecl_sret() { return S(); }
byval_and_sret(S a)20*67e74705SXin Li S C::byval_and_sret(S a) { return S(); }
21*67e74705SXin Li
22*67e74705SXin Li // CHECK: define void @"\01?variadic_sret@C@@QAA?AUS@@PBDZZ"(%struct.C* %this, %struct.S* noalias sret %agg.result, i8* %f, ...)
23*67e74705SXin Li // CHECK: define void @"\01?cdecl_sret@C@@QAA?AUS@@XZ"(%struct.C* %this, %struct.S* noalias sret %agg.result)
24*67e74705SXin Li // CHECK: define void @"\01?byval_and_sret@C@@QAA?AUS@@U2@@Z"(%struct.C* %this, %struct.S* noalias sret %agg.result, %struct.S* byval align 4 %a)
25*67e74705SXin Li
main()26*67e74705SXin Li int main() {
27*67e74705SXin Li C c;
28*67e74705SXin Li c.variadic_sret("asdf");
29*67e74705SXin Li c.cdecl_sret();
30*67e74705SXin Li c.byval_and_sret(S());
31*67e74705SXin Li }
32*67e74705SXin Li // CHECK-LABEL: define i32 @main()
33*67e74705SXin Li // CHECK: call void {{.*}} @"\01?variadic_sret@C@@QAA?AUS@@PBDZZ"
34*67e74705SXin Li // CHECK: call void @"\01?cdecl_sret@C@@QAA?AUS@@XZ"
35*67e74705SXin Li // CHECK: call void @"\01?byval_and_sret@C@@QAA?AUS@@U2@@Z"
36*67e74705SXin Li
37*67e74705SXin Li // __fastcall has similar issues.
38*67e74705SXin Li struct A {
39*67e74705SXin Li S __fastcall f(int x);
40*67e74705SXin Li };
f(int x)41*67e74705SXin Li S A::f(int x) {
42*67e74705SXin Li return S();
43*67e74705SXin Li }
44*67e74705SXin Li // CHECK-LABEL: define x86_fastcallcc void @"\01?f@A@@QAI?AUS@@H@Z"(%struct.A* inreg %this, %struct.S* inreg noalias sret %agg.result, i32 %x)
45