| // RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm %s -o - | FileCheck -check-prefix GCABI %s |
| // RUN: %clang_cc1 -emit-llvm %s -o - -DMS_ABI -triple=i386-pc-win32 | FileCheck -check-prefix MSABI %s |
| |
| #ifdef MS_ABI |
| # define METHOD_CC __thiscall |
| #else |
| # define METHOD_CC __attribute__ ((cdecl)) |
| #endif |
| |
| // Test that it's OK to have multiple function declarations with the default CC |
| // both mentioned explicitly and implied. |
| void foo(); |
| void __cdecl foo(); |
| void __cdecl foo() {} |
| // GCABI-LABEL: define void @_Z3foov() |
| // MSABI: define dso_local void @"?foo@@YAXXZ" |
| |
| void __cdecl bar(); |
| void bar(); |
| void bar() {} |
| // GCABI-LABEL: define void @_Z3barv() |
| // MSABI: define dso_local void @"?bar@@YAXXZ" |
| |
| // Test that it's OK to mark either the method declaration or method definition |
| // with a default CC explicitly. |
| class A { |
| public: |
| void baz(); |
| void METHOD_CC qux(); |
| |
| static void static_baz(); |
| static void __cdecl static_qux(); |
| }; |
| |
| void METHOD_CC A::baz() {} |
| // GCABI-LABEL: define void @_ZN1A3bazEv |
| // MSABI: define dso_local x86_thiscallcc void @"?baz@A@@QAEXXZ" |
| void A::qux() {} |
| // GCABI-LABEL: define void @_ZN1A3quxEv |
| // MSABI: define dso_local x86_thiscallcc void @"?qux@A@@QAEXXZ" |
| |
| void __cdecl static_baz() {} |
| // GCABI-LABEL: define void @_Z10static_bazv |
| // MSABI: define dso_local void @"?static_baz@@YAXXZ" |
| void static_qux() {} |
| // GCABI-LABEL: define void @_Z10static_quxv |
| // MSABI: define dso_local void @"?static_qux@@YAXXZ" |
| |
| namespace PR31656 { |
| template <int I> |
| void __cdecl callee(int args[I]); |
| // GCABI-LABEL: declare void @_ZN7PR316566calleeILi1EEEvPi( |
| // MSABI: declare dso_local void @"??$callee@$00@PR31656@@YAXQAH@Z"( |
| |
| void caller() { callee<1>(0); } |
| } |