16c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman// For MSVC ABI compatibility, all structures returned by value using the 26c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman// thiscall calling convention must use the hidden parameter. 36c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman// 4a3f55b026fc24db6a4e275a8e4110d071122b99dRafael Espindola// RUN: %clang_cc1 -triple i386-PC-Win32 %s -fms-compatibility -emit-llvm -o - | FileCheck %s 56c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 66c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman// This structure would normally be returned via EAX 76c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballmanstruct S { 86c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman int i; 96c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman}; 106c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 116c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman// This structure would normally be returned via EAX/EDX 126c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballmanstruct M { 136c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman int i; 146c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman int j; 156c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman}; 166c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 176c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballmanclass C { 186c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballmanpublic: 196c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman C() {} 206c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 216c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman struct S __attribute__((thiscall)) Small() const { 226c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman struct S s = { 0 }; 236c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman return s; 246c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman } 256c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 266c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman struct M __attribute__((thiscall)) Medium() const { 276c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman struct M m = { 0 }; 286c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman return m; 296c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman } 306c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman}; 316c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z4testv() 336c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballmanvoid test( void ) { 34de40d3be58d381a965a684ba6d51eb786b03b693NAKAMURA Takumi// CHECK: call void @_ZN1CC1Ev(%class.C* [[C:%.+]]) 356c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman C c; 366c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 37de40d3be58d381a965a684ba6d51eb786b03b693NAKAMURA Takumi// CHECK: call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %{{.+}}, %class.C* [[C]]) 386c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman (void)c.Small(); 39de40d3be58d381a965a684ba6d51eb786b03b693NAKAMURA Takumi// CHECK: call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %{{.+}}, %class.C* [[C]]) 406c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman (void)c.Medium(); 416c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman} 42