1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s 2 3class C { 4 public: 5 void simple_method() {} 6 7 void __cdecl cdecl_method() {} 8 9 void vararg_method(const char *fmt, ...) {} 10 11 static void static_method() {} 12 13 int a; 14}; 15 16void call_simple_method() { 17 C instance; 18 19 instance.simple_method(); 20// Make sure that the call uses the right calling convention: 21// CHECK: call x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ" 22// CHECK: ret 23 24// Make sure that the definition uses the right calling convention: 25// CHECK: define linkonce_odr x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ" 26// CHECK: ret 27} 28 29void call_cdecl_method() { 30 C instance; 31 instance.cdecl_method(); 32// Make sure that the call uses the right calling convention: 33// CHECK: call void @"\01?cdecl_method@C@@QAAXXZ" 34// CHECK: ret 35 36// Make sure that the definition uses the right calling convention: 37// CHECK: define linkonce_odr void @"\01?cdecl_method@C@@QAAXXZ" 38// CHECK: ret 39} 40 41void call_vararg_method() { 42 C instance; 43 instance.vararg_method("Hello"); 44// Make sure that the call uses the right calling convention: 45// CHECK: call void (%class.C*, i8*, ...)* @"\01?vararg_method@C@@QAAXPBDZZ" 46// CHECK: ret 47 48// Make sure that the definition uses the right calling convention: 49// CHECK: define linkonce_odr void @"\01?vararg_method@C@@QAAXPBDZZ" 50} 51 52void call_static_method() { 53 C::static_method(); 54// Make sure that the call uses the right calling convention: 55// CHECK: call void @"\01?static_method@C@@SAXXZ" 56// CHECK: ret 57 58// Make sure that the definition uses the right calling convention: 59// CHECK: define linkonce_odr void @"\01?static_method@C@@SAXXZ" 60} 61 62class Base { 63 public: 64 Base() {} 65 ~Base() {} 66}; 67 68class Child: public Base { }; 69 70void constructors() { 71 Child c; 72// Make sure that the Base constructor call in the Child constructor uses 73// the right calling convention: 74// CHECK: define linkonce_odr x86_thiscallcc %class.Child* @"\01??0Child@@QAE@XZ" 75// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.Base* @"\01??0Base@@QAE@XZ" 76// CHECK: ret 77 78// Make sure that the Base destructor call in the Child denstructor uses 79// the right calling convention: 80// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Child@@QAE@XZ" 81// CHECK: call x86_thiscallcc void @"\01??1Base@@QAE@XZ" 82// CHECK: ret 83 84// Make sure that the Base destructor definition uses the right CC: 85// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Base@@QAE@XZ" 86 87// Make sure that the Base constructor definition uses the right CC: 88// CHECK: define linkonce_odr x86_thiscallcc %class.Base* @"\01??0Base@@QAE@XZ" 89} 90