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