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:
parent
c1de64a495
commit
77d6b25fab
@ -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 "
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user