mirror of https://github.com/microsoft/clang.git
Win64: Silently ignore __stdcall, __fastcall, and __thiscall
MSVC doesn't warn on this. Users are expected to apply the WINAPI macro to functions passed by pointer to the Win32 API, and this macro expands to __stdcall. This means we end up with a lot of useless noisy warnings about ignored calling conventions when compiling code with clang for Win64. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230668 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
abe6486f97
commit
413d8cac1a
|
@ -842,7 +842,8 @@ public:
|
|||
|
||||
enum CallingConvCheckResult {
|
||||
CCCR_OK,
|
||||
CCCR_Warning
|
||||
CCCR_Warning,
|
||||
CCCR_Ignore,
|
||||
};
|
||||
|
||||
/// \brief Determines whether a given calling convention is valid for the
|
||||
|
|
|
@ -3626,19 +3626,31 @@ public:
|
|||
IntPtrType = SignedLongLong;
|
||||
this->UserLabelPrefix = "";
|
||||
}
|
||||
|
||||
void getTargetDefines(const LangOptions &Opts,
|
||||
MacroBuilder &Builder) const override {
|
||||
WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
|
||||
Builder.defineMacro("_WIN64");
|
||||
}
|
||||
|
||||
BuiltinVaListKind getBuiltinVaListKind() const override {
|
||||
return TargetInfo::CharPtrBuiltinVaList;
|
||||
}
|
||||
|
||||
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
|
||||
return (CC == CC_C ||
|
||||
CC == CC_X86VectorCall ||
|
||||
CC == CC_IntelOclBicc ||
|
||||
CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
|
||||
switch (CC) {
|
||||
case CC_X86StdCall:
|
||||
case CC_X86ThisCall:
|
||||
case CC_X86FastCall:
|
||||
return CCCR_Ignore;
|
||||
case CC_C:
|
||||
case CC_X86VectorCall:
|
||||
case CC_IntelOclBicc:
|
||||
case CC_X86_64SysV:
|
||||
return CCCR_OK;
|
||||
default:
|
||||
return CCCR_Warning;
|
||||
}
|
||||
}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
|
|
@ -3393,9 +3393,12 @@ bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
|
|||
|
||||
const TargetInfo &TI = Context.getTargetInfo();
|
||||
TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
|
||||
if (A == TargetInfo::CCCR_Warning) {
|
||||
Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
|
||||
if (A != TargetInfo::CCCR_OK) {
|
||||
if (A == TargetInfo::CCCR_Warning)
|
||||
Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
|
||||
|
||||
// This convention is not valid for the target. Use the default function or
|
||||
// method calling convention.
|
||||
TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown;
|
||||
if (FD)
|
||||
MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member :
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-compatibility -triple x86_64-pc-win32
|
||||
int __stdcall f(void); /* expected-warning {{calling convention '__stdcall' ignored for this target}} */
|
||||
// RUN: %clang_cc1 %s -Wmicrosoft -verify -fms-compatibility -triple x86_64-pc-win32
|
||||
|
||||
/* This should compile without warning because __stdcall is treated
|
||||
as __cdecl in MS compatibility mode for x64 compiles*/
|
||||
// None of these should warn. stdcall is treated as equivalent to cdecl on
|
||||
// x64.
|
||||
// expected-no-diagnostics
|
||||
|
||||
int __stdcall f(void);
|
||||
int __cdecl f(void) {
|
||||
return 0;
|
||||
}
|
||||
int __stdcall func_std(void);
|
||||
int __thiscall func_this(void);
|
||||
int __fastcall func_fast(void);
|
||||
|
|
Loading…
Reference in New Issue