1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple i686-pc-mingw32 -fms-extensions -Wmicrosoft %s -emit-llvm -o - | FileCheck %s
28e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
38e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarclass Test1 {
48e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarpublic:
58e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int a;
68e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar};
78e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
88e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarvoid f1() {
98e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test1 var;
108e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test1::Test1();
118e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
128e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %{{.*}}, i8* %{{.*}}, i32 4, i32 4, i1 false)
138e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test1::Test1(var);
148e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar}
158e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
168e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarclass Test2 {
178e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarpublic:
188e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test2() { a = 10; b = 10; }
198e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int a;
208e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int b;
218e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar};
228e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
238e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarvoid f2() {
248e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  // CHECK:  %var = alloca %class.Test2, align 4
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-NEXT:  call x86_thiscallcc void @_ZN5Test2C1Ev(%class.Test2* %var)
268e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test2 var;
278e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-NEXT:  call x86_thiscallcc void @_ZN5Test2C1Ev(%class.Test2* %var)
298e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test2::Test2();
308e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
318e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  // CHECK:  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %{{.*}}, i8* %{{.*}}, i32 8, i32 4, i1 false)
328e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test2::Test2(var);
338e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar}
348e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
358e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
368e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
378e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
388e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarclass Test3 {
398e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarpublic:
408e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test3() { a = 10; b = 15; c = 20; }
418e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test3(const Test3& that) { a = that.a; b = that.b; c = that.c; }
428e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int a;
438e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int b;
448e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar   int c;
458e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar};
468e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
478e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbarvoid f3() {
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var)
498e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test3 var;
508e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var2)
528e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  Test3 var2;
538e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var)
558e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test3::Test3();
568e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1ERKS_(%class.Test3* %var, %class.Test3* dereferenceable({{[0-9]+}}) %var2)
588e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar  var.Test3::Test3(var2);
598e26222104a3fbdbed5322dc60800e32620a2a90Daniel Dunbar}
60