forked from OSchip/llvm-project
Show note for -Wmissing-prototypes for functions with parameters
Summary: There was a search for non-prototype declarations for the function, but we only showed the results for zero-parameter functions. Now we show the note for functions with parameters as well, but we omit the fix-it hint suggesting to add `void`. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D62750 llvm-svn: 363748
This commit is contained in:
parent
4053d95cd8
commit
f9c6e565de
|
@ -4672,7 +4672,8 @@ def warn_missing_prototype : Warning<
|
|||
"no previous prototype for function %0">,
|
||||
InGroup<DiagGroup<"missing-prototypes">>, DefaultIgnore;
|
||||
def note_declaration_not_a_prototype : Note<
|
||||
"this declaration is not a prototype; add 'void' to make it a prototype for a zero-parameter function">;
|
||||
"this declaration is not a prototype; add %select{'void'|parameter declarations}0 "
|
||||
"to make it %select{a prototype for a zero-parameter function|one}0">;
|
||||
def warn_strict_prototypes : Warning<
|
||||
"this %select{function declaration is not|block declaration is not|"
|
||||
"old-style function definition is not preceded by}0 a prototype">,
|
||||
|
|
|
@ -12777,8 +12777,9 @@ void Sema::ActOnFinishInlineFunctionDef(FunctionDecl *D) {
|
|||
Consumer.HandleInlineFunctionDefinition(D);
|
||||
}
|
||||
|
||||
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
|
||||
const FunctionDecl*& PossibleZeroParamPrototype) {
|
||||
static bool
|
||||
ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
|
||||
const FunctionDecl *&PossiblePrototype) {
|
||||
// Don't warn about invalid declarations.
|
||||
if (FD->isInvalidDecl())
|
||||
return false;
|
||||
|
@ -12815,7 +12816,6 @@ static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
|
|||
if (FD->isDeleted())
|
||||
return false;
|
||||
|
||||
bool MissingPrototype = true;
|
||||
for (const FunctionDecl *Prev = FD->getPreviousDecl();
|
||||
Prev; Prev = Prev->getPreviousDecl()) {
|
||||
// Ignore any declarations that occur in function or method
|
||||
|
@ -12823,13 +12823,11 @@ static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
|
|||
if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
|
||||
continue;
|
||||
|
||||
MissingPrototype = !Prev->getType()->isFunctionProtoType();
|
||||
if (FD->getNumParams() == 0)
|
||||
PossibleZeroParamPrototype = Prev;
|
||||
break;
|
||||
PossiblePrototype = Prev;
|
||||
return Prev->getType()->isFunctionNoProtoType();
|
||||
}
|
||||
|
||||
return MissingPrototype;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -13349,21 +13347,22 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
|
|||
// prototype declaration. This warning is issued even if the
|
||||
// definition itself provides a prototype. The aim is to detect
|
||||
// global functions that fail to be declared in header files.
|
||||
const FunctionDecl *PossibleZeroParamPrototype = nullptr;
|
||||
if (ShouldWarnAboutMissingPrototype(FD, PossibleZeroParamPrototype)) {
|
||||
const FunctionDecl *PossiblePrototype = nullptr;
|
||||
if (ShouldWarnAboutMissingPrototype(FD, PossiblePrototype)) {
|
||||
Diag(FD->getLocation(), diag::warn_missing_prototype) << FD;
|
||||
|
||||
if (PossibleZeroParamPrototype) {
|
||||
if (PossiblePrototype) {
|
||||
// We found a declaration that is not a prototype,
|
||||
// but that could be a zero-parameter prototype
|
||||
if (TypeSourceInfo *TI =
|
||||
PossibleZeroParamPrototype->getTypeSourceInfo()) {
|
||||
if (TypeSourceInfo *TI = PossiblePrototype->getTypeSourceInfo()) {
|
||||
TypeLoc TL = TI->getTypeLoc();
|
||||
if (FunctionNoProtoTypeLoc FTL = TL.getAs<FunctionNoProtoTypeLoc>())
|
||||
Diag(PossibleZeroParamPrototype->getLocation(),
|
||||
Diag(PossiblePrototype->getLocation(),
|
||||
diag::note_declaration_not_a_prototype)
|
||||
<< PossibleZeroParamPrototype
|
||||
<< FixItHint::CreateInsertion(FTL.getRParenLoc(), "void");
|
||||
<< (FD->getNumParams() != 0)
|
||||
<< (FD->getNumParams() == 0
|
||||
? FixItHint::CreateInsertion(FTL.getRParenLoc(), "void")
|
||||
: FixItHint{});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -Wmissing-prototypes -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -Wmissing-prototypes -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
|
||||
|
||||
int f();
|
||||
int f(); // expected-note{{this declaration is not a prototype; add parameter declarations to make it one}}
|
||||
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:{{.*}}-[[@LINE-1]]:{{.*}}}:"{{.*}}"
|
||||
|
||||
int f(int x) { return x; } // expected-warning{{no previous prototype for function 'f'}}
|
||||
|
||||
|
@ -15,7 +16,8 @@ int g2(int x) { return x; }
|
|||
|
||||
void test(void);
|
||||
|
||||
int h3();
|
||||
int h3(); // expected-note{{this declaration is not a prototype; add parameter declarations to make it one}}
|
||||
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:{{.*}}-[[@LINE-1]]:{{.*}}}:"{{.*}}"
|
||||
int h4(int);
|
||||
int h4();
|
||||
|
||||
|
@ -38,6 +40,5 @@ int f2(int x) { return x; }
|
|||
int main(void) { return 0; }
|
||||
|
||||
void not_a_prototype_test(); // expected-note{{this declaration is not a prototype; add 'void' to make it a prototype for a zero-parameter function}}
|
||||
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:27-[[@LINE-1]]:27}:"void"
|
||||
void not_a_prototype_test() { } // expected-warning{{no previous prototype for function 'not_a_prototype_test'}}
|
||||
|
||||
// CHECK: fix-it:"{{.*}}":{40:27-40:27}:"void"
|
||||
|
|
Loading…
Reference in New Issue