| 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. |
| 12 | void foo(); |
| 13 | void __cdecl foo(); |
| 14 | void __cdecl foo() {} |
| 15 | // GCABI-LABEL: define void @_Z3foov() |
| 16 | // MSABI: define dso_local void @"?foo@@YAXXZ" |
| 17 | |
| 18 | void __cdecl bar(); |
| 19 | void bar(); |
| 20 | void bar() {} |
| 21 | // GCABI-LABEL: define void @_Z3barv() |
| 22 | // MSABI: define dso_local void @"?bar@@YAXXZ" |
| 23 | |
| 24 | // Test that it's OK to mark either the method declaration or method definition |
| 25 | // with a default CC explicitly. |
| 26 | class A { |
| 27 | public: |
| 28 | void baz(); |
| 29 | void METHOD_CC qux(); |
| 30 | |
| 31 | static void static_baz(); |
| 32 | static void __cdecl static_qux(); |
| 33 | }; |
| 34 | |
| 35 | void METHOD_CC A::baz() {} |
| 36 | // GCABI-LABEL: define void @_ZN1A3bazEv |
| 37 | // MSABI: define dso_local x86_thiscallcc void @"?baz@A@@QAEXXZ" |
| 38 | void A::qux() {} |
| 39 | // GCABI-LABEL: define void @_ZN1A3quxEv |
| 40 | // MSABI: define dso_local x86_thiscallcc void @"?qux@A@@QAEXXZ" |
| 41 | |
| 42 | void __cdecl static_baz() {} |
| 43 | // GCABI-LABEL: define void @_Z10static_bazv |
| 44 | // MSABI: define dso_local void @"?static_baz@@YAXXZ" |
| 45 | void static_qux() {} |
| 46 | // GCABI-LABEL: define void @_Z10static_quxv |
| 47 | // MSABI: define dso_local void @"?static_qux@@YAXXZ" |
| 48 | |
| 49 | namespace PR31656 { |
| 50 | template <int I> |
| 51 | void __cdecl callee(int args[I]); |
| 52 | // GCABI-LABEL: declare void @_ZN7PR316566calleeILi1EEEvPi( |
| 53 | // MSABI: declare dso_local void @"??$callee@$00@PR31656@@YAXQAH@Z"( |
| 54 | |
| 55 | void caller() { callee<1>(0); } |
| 56 | } |
| 57 | |