From: Anders Carlsson Date: Tue, 18 Dec 2012 01:29:20 +0000 (+0000) Subject: When warning about a missing prototype because a function declaration is missing... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8a0086cfd21e5a89f96715d7a504178c5fc0ca26;p=clang 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 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 3e638769eb..950fc4bcb0 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -3176,6 +3176,8 @@ def note_sentinel_here : Note< def warn_missing_prototype : Warning< "no previous prototype for function %0">, InGroup>, 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>, DefaultIgnore; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 1f80390b40..ab931a773f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(&TL)) + Diag(PossibleZeroParamPrototype->getLocation(), + diag::note_declaration_not_a_prototype) + << PossibleZeroParamPrototype + << FixItHint::CreateInsertion(FTL->getRParenLoc(), "void"); + } + } if (FnBodyScope) PushDeclContext(FnBodyScope, FD); diff --git a/test/Sema/warn-missing-prototypes.c b/test/Sema/warn-missing-prototypes.c index bfd1459b41..10018b6015 100644 --- a/test/Sema/warn-missing-prototypes.c +++ b/test/Sema/warn-missing-prototypes.c @@ -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"