Home | History | Annotate | Download | only in CodeGenCXX
      1 // For MSVC ABI compatibility, all structures returned by value using the
      2 // thiscall calling convention must use the hidden parameter.
      3 //
      4 // RUN: %clang_cc1 -triple i386-PC-Win32 %s -fms-compatibility -O0 -emit-llvm -o - | FileCheck %s
      5 
      6 // This structure would normally be returned via EAX
      7 struct S {
      8   int i;
      9 };
     10 
     11 // This structure would normally be returned via EAX/EDX
     12 struct M {
     13   int i;
     14   int j;
     15 };
     16 
     17 class C {
     18 public:
     19   C() {}
     20 
     21   struct S __attribute__((thiscall)) Small() const {
     22     struct S s = { 0 };
     23     return s;
     24   }
     25 
     26   struct M __attribute__((thiscall)) Medium() const {
     27     struct M m = { 0 };
     28     return m;
     29   }
     30 };
     31 
     32 // CHECK: define void @_Z4testv()
     33 void test( void ) {
     34 // CHECK: call void @_ZN1CC1Ev(%class.C* [[C:%.+]])
     35   C c;
     36 
     37 // CHECK: call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %{{.+}}, %class.C* [[C]])
     38   (void)c.Small();
     39 // CHECK: call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %{{.+}}, %class.C* [[C]])
     40   (void)c.Medium();
     41 }
     42