forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s
 | 
						|
 | 
						|
class C {
 | 
						|
 public:
 | 
						|
  void simple_method() {}
 | 
						|
 | 
						|
  void __cdecl cdecl_method() {}
 | 
						|
 | 
						|
  void vararg_method(const char *fmt, ...) {}
 | 
						|
 | 
						|
  static void static_method() {}
 | 
						|
 | 
						|
  int a;
 | 
						|
};
 | 
						|
 | 
						|
void call_simple_method() {
 | 
						|
  C instance;
 | 
						|
 | 
						|
  instance.simple_method();
 | 
						|
// Make sure that the call uses the right calling convention:
 | 
						|
// CHECK: call x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the definition uses the right calling convention:
 | 
						|
// CHECK: define linkonce_odr x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ"
 | 
						|
// CHECK: ret
 | 
						|
}
 | 
						|
 | 
						|
void call_cdecl_method() {
 | 
						|
  C instance;
 | 
						|
  instance.cdecl_method();
 | 
						|
// Make sure that the call uses the right calling convention:
 | 
						|
// CHECK: call void @"\01?cdecl_method@C@@QAAXXZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the definition uses the right calling convention:
 | 
						|
// CHECK: define linkonce_odr void @"\01?cdecl_method@C@@QAAXXZ"
 | 
						|
// CHECK: ret
 | 
						|
}
 | 
						|
 | 
						|
void call_vararg_method() {
 | 
						|
  C instance;
 | 
						|
  instance.vararg_method("Hello");
 | 
						|
// Make sure that the call uses the right calling convention:
 | 
						|
// CHECK: call void (%class.C*, i8*, ...) @"\01?vararg_method@C@@QAAXPBDZZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the definition uses the right calling convention:
 | 
						|
// CHECK: define linkonce_odr void @"\01?vararg_method@C@@QAAXPBDZZ"
 | 
						|
}
 | 
						|
 | 
						|
void call_static_method() {
 | 
						|
  C::static_method();
 | 
						|
// Make sure that the call uses the right calling convention:
 | 
						|
// CHECK: call void @"\01?static_method@C@@SAXXZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the definition uses the right calling convention:
 | 
						|
// CHECK: define linkonce_odr void @"\01?static_method@C@@SAXXZ"
 | 
						|
}
 | 
						|
 | 
						|
class Base {
 | 
						|
 public:
 | 
						|
  Base() {}
 | 
						|
  ~Base() {}
 | 
						|
};
 | 
						|
 | 
						|
class Child: public Base { };
 | 
						|
 | 
						|
void constructors() {
 | 
						|
  Child c;
 | 
						|
// Make sure that the Base constructor call in the Child constructor uses
 | 
						|
// the right calling convention:
 | 
						|
// CHECK: define linkonce_odr x86_thiscallcc %class.Child* @"\01??0Child@@QAE@XZ"
 | 
						|
// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.Base* @"\01??0Base@@QAE@XZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the Base constructor definition uses the right CC:
 | 
						|
// CHECK: define linkonce_odr x86_thiscallcc %class.Base* @"\01??0Base@@QAE@XZ"
 | 
						|
 | 
						|
// Make sure that the Base destructor call in the Child denstructor uses
 | 
						|
// the right calling convention:
 | 
						|
// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Child@@QAE@XZ"
 | 
						|
// CHECK: call x86_thiscallcc void @"\01??1Base@@QAE@XZ"
 | 
						|
// CHECK: ret
 | 
						|
 | 
						|
// Make sure that the Base destructor definition uses the right CC:
 | 
						|
// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Base@@QAE@XZ"
 | 
						|
}
 |