From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MTA-11-3.privateemail.com (mta-11-3.privateemail.com [198.54.122.105]) by sourceware.org (Postfix) with ESMTPS id 90DD33858C5E for ; Wed, 5 Jul 2023 13:54:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 90DD33858C5E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=effective-light.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=effective-light.com Received: from mta-11.privateemail.com (localhost [127.0.0.1]) by mta-11.privateemail.com (Postfix) with ESMTP id 4773618000BE for ; Wed, 5 Jul 2023 09:54:43 -0400 (EDT) Received: from [192.168.2.177] (bras-base-toroon4332w-grc-14-142-126-96-102.dsl.bell.ca [142.126.96.102]) by mta-11.privateemail.com (Postfix) with ESMTPA id 0662718000B1 for ; Wed, 5 Jul 2023 09:54:42 -0400 (EDT) Date: Wed, 05 Jul 2023 09:54:35 -0400 From: Hamza Mahfooz Subject: Re: [PATCH] Add -Wmissing-variable-declarations [PR65213]. To: gcc-patches@gcc.gnu.org Message-Id: In-Reply-To: <20230613130529.7762-1-someguy@effective-light.com> References: <20230613130529.7762-1-someguy@effective-light.com> X-Mailer: geary/43.0 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed X-Virus-Scanned: ClamAV using ClamSMTP X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Ping? On Tue, Jun 13 2023 at 09:05:29 AM -04:00:00, Hamza Mahfooz wrote: > Resolves: > PR c/65213 - Extend -Wmissing-declarations to variables [i.e. add > -Wmissing-variable-declarations] > > gcc/c-family/ChangeLog: > > PR c/65213 > * c.opt (-Wmissing-variable-declarations): New option. > > gcc/c/ChangeLog: > > PR c/65213 > * c-decl.cc (start_decl): Handle -Wmissing-variable-declarations > > gcc/ChangeLog: > > PR c/65213 > * doc/invoke.texi (-Wmissing-variable-declarations): Document > new option. > > gcc/testsuite/ChangeLog: > > PR c/65213 > * gcc.dg/Wmissing-variable-declarations.c: New test. > > Signed-off-by: Hamza Mahfooz > --- > gcc/c-family/c.opt | 4 +++ > gcc/c/c-decl.cc | 10 +++++- > gcc/doc/invoke.texi | 11 +++++-- > .../gcc.dg/Wmissing-variable-declarations.c | 33 > +++++++++++++++++++ > 4 files changed, 55 insertions(+), 3 deletions(-) > create mode 100644 > gcc/testsuite/gcc.dg/Wmissing-variable-declarations.c > > diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt > index cead1995561..42ad447f39b 100644 > --- a/gcc/c-family/c.opt > +++ b/gcc/c-family/c.opt > @@ -1043,6 +1043,10 @@ Wmissing-prototypes > C ObjC Var(warn_missing_prototypes) Warning > Warn about global functions without prototypes. > > +Wmissing-variable-declarations > +C ObjC Var(warn_missing_variable_declarations) Warning > +Warn about global variables without previous declarations. > + > Wmudflap > C ObjC C++ ObjC++ WarnRemoved > > diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc > index 1af51c4acfc..8e276b2a846 100644 > --- a/gcc/c/c-decl.cc > +++ b/gcc/c/c-decl.cc > @@ -5340,6 +5340,7 @@ start_decl (struct c_declarator *declarator, > struct c_declspecs *declspecs, > location_t *lastloc /* = NULL */) > { > tree decl; > + tree old_decl; > tree tem; > tree expr = NULL_TREE; > enum deprecated_states deprecated_state = DEPRECATED_NORMAL; > @@ -5360,7 +5361,9 @@ start_decl (struct c_declarator *declarator, > struct c_declspecs *declspecs, > if (!decl || decl == error_mark_node) > return NULL_TREE; > > - if (tree lastdecl = lastloc ? lookup_last_decl (decl) : NULL_TREE) > + old_decl = lookup_last_decl (decl); > + > + if (tree lastdecl = lastloc ? old_decl : NULL_TREE) > if (lastdecl != error_mark_node) > *lastloc = DECL_SOURCE_LOCATION (lastdecl); > > @@ -5372,6 +5375,11 @@ start_decl (struct c_declarator *declarator, > struct c_declspecs *declspecs, > && TREE_PUBLIC (decl)) > warning (OPT_Wmain, "%q+D is usually a function", decl); > > + if (warn_missing_variable_declarations && VAR_P (decl) > + && !DECL_EXTERNAL (decl) && TREE_PUBLIC (decl) && old_decl == > NULL_TREE) > + warning_at (DECL_SOURCE_LOCATION (decl), > OPT_Wmissing_variable_declarations, > + "no previous declaration for %qD", decl); > + > if (initialized) > /* Is it valid for this decl to have an initializer at all? > If not, set INITIALIZED to zero, which will indirectly > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index 8fa3f9fae01..e9b51842234 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -496,8 +496,8 @@ Objective-C and Objective-C++ Dialects}. > > @item C and Objective-C-only Warning Options > @gccoptlist{-Wbad-function-cast -Wmissing-declarations > --Wmissing-parameter-type -Wmissing-prototypes -Wnested-externs > --Wold-style-declaration -Wold-style-definition > +-Wmissing-parameter-type -Wmissing-prototypes > -Wmissing-variable-declarations > +-Wnested-externs -Wold-style-declaration -Wold-style-definition > -Wstrict-prototypes -Wtraditional -Wtraditional-conversion > -Wdeclaration-after-statement -Wpointer-sign} > > @@ -9565,6 +9565,13 @@ provide prototypes and a non-matching > declaration declares an > overload rather than conflict with an earlier declaration. > Use @option{-Wmissing-declarations} to detect missing declarations > in C++. > > +@opindex Wmissing-variable-declarations > +@opindex Wno-missing-variable-declarations > +@item -Wmissing-variable-declarations @r{(C and Objective-C only)} > +Warn if a global variable is defined without a previous declaration. > +Use this option to detect global variables that do not have a > matching > +extern declaration in a header file. > + > @opindex Wmissing-declarations > @opindex Wno-missing-declarations > @item -Wmissing-declarations > diff --git a/gcc/testsuite/gcc.dg/Wmissing-variable-declarations.c > b/gcc/testsuite/gcc.dg/Wmissing-variable-declarations.c > new file mode 100644 > index 00000000000..b292dbe8c22 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/Wmissing-variable-declarations.c > @@ -0,0 +1,33 @@ > +/* { dg-do compile } */ > +/* { dg-options "-Wmissing-variable-declarations" } */ > + > +int b0; /* { dg-warning "no previous declaration for 'b0'" } */ > + > +int b1 = 1; /* { dg-warning "no previous declaration for 'b1'" } */ > + > +int b2; /* { dg-warning "no previous declaration for 'b2'" } */ > +int b2 = 2; > + > +struct { > + int g0; > +} b3; /* { dg-warning "no previous declaration for 'b3'" } */ > + > +int b4; /* { dg-warning "no previous declaration for 'b4'" } */ > +int b4 = 3; > +extern int b4; > + > +static int g1; > + > +void g2(void); > + > +extern int g3; > +int g3; > +int g3 = 4; > + > +struct g4 { > + int g5; > +}; > + > +void g6(void) { > + int g7; > +} > -- > 2.40.1 >