From owner-svn-src-all@FreeBSD.ORG Thu Oct 25 10:13:59 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5743AD1A; Thu, 25 Oct 2012 10:13:59 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 343128FC0C; Thu, 25 Oct 2012 10:13:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9PADxRC029051; Thu, 25 Oct 2012 10:13:59 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9PADwYO029047; Thu, 25 Oct 2012 10:13:58 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <201210251013.q9PADwYO029047@svn.freebsd.org> From: Ed Schouten Date: Thu, 25 Oct 2012 10:13:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r242080 - in head/contrib/llvm/tools/clang: include/clang/Basic lib/Sema X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Oct 2012 10:13:59 -0000 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>, DefaultIgnore; +def warn_missing_variable_declarations : Warning< + "no previous extern declaration for non-static variable %0">, + InGroup>, 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;