Pull in r166498 from upstream clang trunk:

Add a new warning -Wmissing-variable-declarations, to warn about variables
defined without a previous declaration.  This is similar to
-Wmissing-prototypes, but for variables instead of functions.
This commit is contained in:
Ed Schouten 2012-10-25 10:13:58 +00:00
parent c1de64a495
commit 77d6b25fab
3 changed files with 16 additions and 0 deletions

View File

@ -3058,6 +3058,9 @@ def note_sentinel_here : Note<
def warn_missing_prototype : Warning<
"no previous prototype for function %0">,
InGroup<DiagGroup<"missing-prototypes">>, DefaultIgnore;
def warn_missing_variable_declarations : Warning<
"no previous extern declaration for non-static variable %0">,
InGroup<DiagGroup<"missing-variable-declarations">>, DefaultIgnore;
def err_redefinition : Error<"redefinition of %0">;
def err_definition_of_implicitly_declared_member : Error<
"definition of implicitly declared %select{default constructor|copy "

View File

@ -648,6 +648,8 @@ void Sema::ActOnEndOfTranslationUnit() {
diag::err_tentative_def_incomplete_type))
VD->setInvalidDecl();
CheckCompleteVariableDeclaration(VD);
// Notify the consumer that we've completed a tentative definition.
if (!VD->isInvalidDecl())
Consumer.CompleteTentativeDefinition(VD);

View File

@ -6957,6 +6957,17 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {
}
}
if (var->isThisDeclarationADefinition() &&
var->getLinkage() == ExternalLinkage) {
// Find a previous declaration that's not a definition.
VarDecl *prev = var->getPreviousDecl();
while (prev && prev->isThisDeclarationADefinition())
prev = prev->getPreviousDecl();
if (!prev)
Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
}
// All the following checks are C++ only.
if (!getLangOpts().CPlusPlus) return;