r221184 - Don't diagnose no-prototype callee-cleanup function definitions
Reid Kleckner
reid at kleckner.net
Mon Nov 3 13:24:50 PST 2014
Author: rnk
Date: Mon Nov 3 15:24:50 2014
New Revision: 221184
URL: http://llvm.org/viewvc/llvm-project?rev=221184&view=rev
Log:
Don't diagnose no-prototype callee-cleanup function definitions
We already have a warning on the call sites of code like this:
void f() { }
void g() { f(1, 2, 3); }
t.c:2:21: warning: too many arguments in call to 'f'
We can limit ourselves to diagnosing unprototyped forward declarations
of f to cut down on noise.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/Sema/callingconv.c
cfe/trunk/test/Sema/decl-microsoft-call-conv.c
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=221184&r1=221183&r2=221184&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Nov 3 15:24:50 2014
@@ -7383,6 +7383,21 @@ Sema::ActOnFunctionDeclarator(Scope *S,
if (!NewFD->isInvalidDecl() && NewFD->isMSVCRTEntryPoint())
CheckMSVCRTEntryPoint(NewFD);
+ // Diagnose no-prototype function declarations with calling conventions that
+ // don't support variadic calls.
+ const FunctionType *FT = R->castAs<FunctionType>();
+ if (FT->isFunctionNoProtoType() && !D.isFunctionDefinition()) {
+ CallingConv CC = FT->getExtInfo().getCC();
+ if (!supportsVariadicCall(CC)) {
+ // Windows system headers sometimes accidentally use stdcall without
+ // (void) parameters, so we relax this to a warning.
+ int DiagID =
+ CC == CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
+ Diag(NewFD->getLocation(), DiagID)
+ << FunctionType::getNameForCallConv(CC);
+ }
+ }
+
if (!NewFD->isInvalidDecl())
D.setRedeclaration(CheckFunctionDeclaration(S, NewFD, Previous,
isExplicitSpecialization));
@@ -7948,21 +7963,6 @@ bool Sema::CheckFunctionDeclaration(Scop
// Semantic checking for this function declaration (in isolation).
- // Diagnose calling conventions that don't support variadic calls.
- QualType NewQType = Context.getCanonicalType(NewFD->getType());
- const FunctionType *NewType = cast<FunctionType>(NewQType);
- if (isa<FunctionNoProtoType>(NewType)) {
- FunctionType::ExtInfo NewTypeInfo = NewType->getExtInfo();
- if (!supportsVariadicCall(NewTypeInfo.getCC())) {
- // Windows system headers sometimes accidentally use stdcall without
- // (void) parameters, so use a default-error warning in this case :-/
- int DiagID = NewTypeInfo.getCC() == CC_X86StdCall
- ? diag::warn_cconv_knr : diag::err_cconv_knr;
- Diag(NewFD->getLocation(), DiagID)
- << FunctionType::getNameForCallConv(NewTypeInfo.getCC());
- }
- }
-
if (getLangOpts().CPlusPlus) {
// C++-specific checks.
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(NewFD)) {
Modified: cfe/trunk/test/Sema/callingconv.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv.c?rev=221184&r1=221183&r2=221184&view=diff
==============================================================================
--- cfe/trunk/test/Sema/callingconv.c (original)
+++ cfe/trunk/test/Sema/callingconv.c Mon Nov 3 15:24:50 2014
@@ -10,7 +10,7 @@ void __attribute__((stdcall)) bar(float
void __attribute__((fastcall(1))) baz(float *a) { // expected-error {{'fastcall' attribute takes no arguments}}
}
-void __attribute__((fastcall)) test0() { // expected-error {{function with no prototype cannot use the fastcall calling convention}}
+void __attribute__((fastcall)) test0() {
}
void __attribute__((fastcall)) test1(void) {
Modified: cfe/trunk/test/Sema/decl-microsoft-call-conv.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/decl-microsoft-call-conv.c?rev=221184&r1=221183&r2=221184&view=diff
==============================================================================
--- cfe/trunk/test/Sema/decl-microsoft-call-conv.c (original)
+++ cfe/trunk/test/Sema/decl-microsoft-call-conv.c Mon Nov 3 15:24:50 2014
@@ -14,11 +14,17 @@ void __pascal CrcGenerateTablePascal() {
void __vectorcall CrcGenerateTableVectorcall(void);
void __vectorcall CrcGenerateTableVectorcall() {}
-void __fastcall CrcGenerateTableNoProtoFastcall() {} // expected-error{{function with no prototype cannot use the fastcall calling convention}}
-void __stdcall CrcGenerateTableNoProtoStdcall() {} // expected-warning{{function with no prototype cannot use the stdcall calling convention}}
-void __thiscall CrcGenerateTableNoProtoThiscall() {} // expected-error{{function with no prototype cannot use the thiscall calling convention}}
-void __pascal CrcGenerateTableNoProtoPascal() {} // expected-error{{function with no prototype cannot use the pascal calling convention}}
-void __vectorcall CrcGenerateTableNoProtoVectorcall() {} // expected-error{{function with no prototype cannot use the vectorcall calling convention}}
+void __fastcall CrcGenerateTableNoProtoFastcall(); // expected-error{{function with no prototype cannot use the fastcall calling convention}}
+void __stdcall CrcGenerateTableNoProtoStdcall(); // expected-warning{{function with no prototype cannot use the stdcall calling convention}}
+void __thiscall CrcGenerateTableNoProtoThiscall(); // expected-error{{function with no prototype cannot use the thiscall calling convention}}
+void __pascal CrcGenerateTableNoProtoPascal(); // expected-error{{function with no prototype cannot use the pascal calling convention}}
+void __vectorcall CrcGenerateTableNoProtoVectorcall(); // expected-error{{function with no prototype cannot use the vectorcall calling convention}}
+
+void __fastcall CrcGenerateTableNoProtoDefFastcall() {}
+void __stdcall CrcGenerateTableNoProtoDefStdcall() {}
+void __thiscall CrcGenerateTableNoProtoDefThiscall() {}
+void __pascal CrcGenerateTableNoProtoDefPascal() {}
+void __vectorcall CrcGenerateTableNoProtoDefVectorcall() {}
// Regular calling convention is fine.
void CrcGenerateTableNoProto() {}
More information about the cfe-commits
mailing list