1// RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm %s -o - | FileCheck -check-prefix GCABI %s
2// RUN: %clang_cc1 -emit-llvm %s -o - -DMS_ABI -triple=i386-pc-win32 | FileCheck -check-prefix MSABI %s
3
4#ifdef MS_ABI
5# define METHOD_CC __thiscall
6#else
7# define METHOD_CC __attribute__ ((cdecl))
8#endif
9
10// Test that it's OK to have multiple function declarations with the default CC
11// both mentioned explicitly and implied.
12void foo();
13void __cdecl foo();
14void __cdecl foo() {}
15// GCABI-LABEL: define void @_Z3foov()
16// MSABI: define void @"\01?foo@@YAXXZ"
17
18void __cdecl bar();
19void bar();
20void bar() {}
21// GCABI-LABEL: define void @_Z3barv()
22// MSABI: define void @"\01?bar@@YAXXZ"
23
24// Test that it's OK to mark either the method declaration or method definition
25// with a default CC explicitly.
26class A {
27public:
28  void baz();
29  void METHOD_CC qux();
30
31  static void static_baz();
32  static void __cdecl static_qux();
33};
34
35void METHOD_CC A::baz() {}
36// GCABI-LABEL: define void @_ZN1A3bazEv
37// MSABI: define x86_thiscallcc void @"\01?baz@A@@QAEXXZ"
38void A::qux() {}
39// GCABI-LABEL: define void @_ZN1A3quxEv
40// MSABI: define x86_thiscallcc void @"\01?qux@A@@QAEXXZ"
41
42void __cdecl static_baz() {}
43// GCABI-LABEL: define void @_Z10static_bazv
44// MSABI: define void @"\01?static_baz@@YAXXZ"
45void static_qux() {}
46// GCABI-LABEL: define void @_Z10static_quxv
47// MSABI: define void @"\01?static_qux@@YAXXZ"
48