Author: ed
Date: Thu Oct 25 10:13:58 2012
New Revision: 242080
URL: http://svn.freebsd.org/changeset/base/242080

Log:
  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.

Modified:
  head/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
  head/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
  head/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp

Modified: 
head/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
==============================================================================
--- head/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td    
Thu Oct 25 09:39:14 2012        (r242079)
+++ head/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td    
Thu Oct 25 10:13:58 2012        (r242080)
@@ -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 "

Modified: head/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
==============================================================================
--- head/contrib/llvm/tools/clang/lib/Sema/Sema.cpp     Thu Oct 25 09:39:14 
2012        (r242079)
+++ head/contrib/llvm/tools/clang/lib/Sema/Sema.cpp     Thu Oct 25 10:13:58 
2012        (r242080)
@@ -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);

Modified: head/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp
==============================================================================
--- head/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp Thu Oct 25 09:39:14 
2012        (r242079)
+++ head/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp Thu Oct 25 10:13:58 
2012        (r242080)
@@ -6957,6 +6957,17 @@ void Sema::CheckCompleteVariableDeclarat
     }
   }
 
+  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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to