зеркало из https://github.com/microsoft/clang-1.git
When warning about a missing prototype because a function declaration is missing 'void', insert a fixit to add the void.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170399 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
adff43ad96
Коммит
8a0086cfd2
|
@ -3176,6 +3176,8 @@ def note_sentinel_here : Note<
|
|||
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">;
|
||||
def warn_missing_variable_declarations : Warning<
|
||||
"no previous extern declaration for non-static variable %0">,
|
||||
InGroup<DiagGroup<"missing-variable-declarations">>, DefaultIgnore;
|
||||
|
|
|
@ -7762,7 +7762,8 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D) {
|
|||
return ActOnStartOfFunctionDef(FnBodyScope, DP);
|
||||
}
|
||||
|
||||
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD) {
|
||||
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
|
||||
const FunctionDecl*& PossibleZeroParamPrototype) {
|
||||
// Don't warn about invalid declarations.
|
||||
if (FD->isInvalidDecl())
|
||||
return false;
|
||||
|
@ -7804,6 +7805,8 @@ static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD) {
|
|||
continue;
|
||||
|
||||
MissingPrototype = !Prev->getType()->isFunctionProtoType();
|
||||
if (FD->getNumParams() == 0)
|
||||
PossibleZeroParamPrototype = Prev;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -7869,8 +7872,22 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D) {
|
|||
// 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.
|
||||
if (ShouldWarnAboutMissingPrototype(FD))
|
||||
const FunctionDecl *PossibleZeroParamPrototype = 0;
|
||||
if (ShouldWarnAboutMissingPrototype(FD, PossibleZeroParamPrototype)) {
|
||||
Diag(FD->getLocation(), diag::warn_missing_prototype) << FD;
|
||||
|
||||
if (PossibleZeroParamPrototype) {
|
||||
// We found a declaration that is not a prototype,
|
||||
// but that could be a zero-parameter prototype
|
||||
TypeSourceInfo* TI = PossibleZeroParamPrototype->getTypeSourceInfo();
|
||||
TypeLoc TL = TI->getTypeLoc();
|
||||
if (FunctionNoProtoTypeLoc* FTL = dyn_cast<FunctionNoProtoTypeLoc>(&TL))
|
||||
Diag(PossibleZeroParamPrototype->getLocation(),
|
||||
diag::note_declaration_not_a_prototype)
|
||||
<< PossibleZeroParamPrototype
|
||||
<< FixItHint::CreateInsertion(FTL->getRParenLoc(), "void");
|
||||
}
|
||||
}
|
||||
|
||||
if (FnBodyScope)
|
||||
PushDeclContext(FnBodyScope, FD);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang -Wmissing-prototypes -fsyntax-only -Xclang -verify %s
|
||||
// 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();
|
||||
|
||||
|
@ -35,3 +36,8 @@ int f2(int x) { return x; }
|
|||
|
||||
// rdar://6759522
|
||||
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}}
|
||||
void not_a_prototype_test() { } // expected-warning{{no previous prototype for function 'not_a_prototype_test'}}
|
||||
|
||||
// CHECK: fix-it:"{{.*}}":{40:27-40:27}:"void"
|
||||
|
|
Загрузка…
Ссылка в новой задаче