// For MSVC ABI compatibility, all structures returned by value using the // thiscall calling convention must use the hidden parameter. // // RUN: %clang_cc1 -triple i386-PC-Win32 %s -fms-compatibility -emit-llvm -o - | FileCheck %s // This structure would normally be returned via EAX struct S { int i; }; // This structure would normally be returned via EAX/EDX struct M { int i; int j; }; class C { public: C() {} struct S __attribute__((thiscall)) Small() const { struct S s = { 0 }; return s; } struct M __attribute__((thiscall)) Medium() const { struct M m = { 0 }; return m; } }; // CHECK-LABEL: define void @_Z4testv() void test( void ) { // CHECK: call void @_ZN1CC1Ev(%class.C* [[C:%.+]]) C c; // CHECK: call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %{{.+}}, %class.C* [[C]]) (void)c.Small(); // CHECK: call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %{{.+}}, %class.C* [[C]]) (void)c.Medium(); }