[cfe-commits] r166498 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/Sema.cpp lib/Sema/SemaDecl.cpp test/Sema/warn-missing-variable-declarations.c test/Sema/warn-missing-variable-declarations.cpp
Matthieu Monrocq
matthieu.monrocq at gmail.com
Wed Oct 24 11:36:02 PDT 2012
On Tue, Oct 23, 2012 at 10:19 PM, Eli Friedman <eli.friedman at gmail.com>wrote:
> Author: efriedma
> Date: Tue Oct 23 15:19:32 2012
> New Revision: 166498
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166498&view=rev
> Log:
> 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.
>
> Patch by Ed Schouten.
>
>
> Added:
> cfe/trunk/test/Sema/warn-missing-variable-declarations.c
> cfe/trunk/test/Sema/warn-missing-variable-declarations.cpp
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/lib/Sema/Sema.cpp
> cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=166498&r1=166497&r2=166498&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Oct 23
> 15:19:32 2012
> @@ -3139,6 +3139,9 @@
> 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: cfe/trunk/lib/Sema/Sema.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=166498&r1=166497&r2=166498&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Tue Oct 23 15:19:32 2012
> @@ -665,6 +665,8 @@
>
> 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: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=166498&r1=166497&r2=166498&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Oct 23 15:19:32 2012
> @@ -7148,6 +7148,17 @@
> }
> }
>
> + 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;
>
>
> Added: cfe/trunk/test/Sema/warn-missing-variable-declarations.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-missing-variable-declarations.c?rev=166498&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-missing-variable-declarations.c (added)
> +++ cfe/trunk/test/Sema/warn-missing-variable-declarations.c Tue Oct 23
> 15:19:32 2012
> @@ -0,0 +1,36 @@
> +// RUN: %clang -Wmissing-variable-declarations -fsyntax-only -Xclang
> -verify %s
> +
> +int vbad1; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad1'}}
> +
> +int vbad2;
> +int vbad2 = 10; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad2'}}
> +
> +struct {
> + int mgood1;
> +} vbad3; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad3'}}
> +
> +int vbad4;
> +int vbad4 = 10; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad4'}}
> +extern int vbad4;
> +
> +extern int vgood1;
> +int vgood1;
> +int vgood1 = 10;
> +// RUN: %clang -Wmissing-variable-declarations -fsyntax-only -Xclang
> -verify %s
> +
> +int vbad1; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad1'}}
> +
> +int vbad2;
> +int vbad2 = 10; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad2'}}
> +
> +struct {
> + int mgood1;
> +} vbad3; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad3'}}
> +
> +int vbad4;
> +int vbad4 = 10; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad4'}}
> +extern int vbad4;
> +
> +extern int vgood1;
> +int vgood1;
> +int vgood1 = 10;
>
> Did I miss something or is this test case "doubled" ?
> Added: cfe/trunk/test/Sema/warn-missing-variable-declarations.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-missing-variable-declarations.cpp?rev=166498&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-missing-variable-declarations.cpp (added)
> +++ cfe/trunk/test/Sema/warn-missing-variable-declarations.cpp Tue Oct 23
> 15:19:32 2012
> @@ -0,0 +1,39 @@
> +// RUN: %clang -Wmissing-variable-declarations -fsyntax-only -Xclang
> -verify %s
> +
> +// Variable declarations that should trigger a warning.
> +int vbad1; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad1'}}
> +int vbad2 = 10; // expected-warning{{no previous extern declaration for
> non-static variable 'vbad2'}}
> +
> +// Variable declarations that should not trigger a warning.
> +static int vgood1;
> +extern int vgood2;
> +int vgood2;
> +static struct {
> + int mgood1;
> +} vgood3;
> +
> +// Functions should never trigger a warning.
> +void fgood1(void);
> +void fgood2(void) {
> + int lgood1;
> + static int lgood2;
> +}
> +static void fgood3(void) {
> + int lgood3;
> + static int lgood4;
> +}
> +
> +// Structures, namespaces and classes should be unaffected.
> +struct sgood1 {
> + int mgood2;
> +};
> +struct {
> + int mgood3;
> +} sgood2;
> +class CGood1 {
> + static int MGood1;
> +};
> +int CGood1::MGood1;
> +namespace {
> + int mgood4;
> +}
>
>
>
How does this interact with "static" variables (at file scope) ?
Also, there is no test in "named" namespaces, should not this be covered
too ?
-- Matthieu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121024/8c911c53/attachment.html>
More information about the cfe-commits
mailing list