From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MTA-05-3.privateemail.com (mta-05-3.privateemail.com [198.54.118.212]) by sourceware.org (Postfix) with ESMTPS id 342603858D32 for ; Tue, 18 Jul 2023 19:15:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 342603858D32 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-05.privateemail.com (localhost [127.0.0.1]) by mta-05.privateemail.com (Postfix) with ESMTP id 63274180216A; Tue, 18 Jul 2023 15:15:07 -0400 (EDT) Received: from hal-station.. (unknown [76.66.148.229]) by mta-05.privateemail.com (Postfix) with ESMTPA id 89927180216B; Tue, 18 Jul 2023 15:15:01 -0400 (EDT) From: Hamza Mahfooz To: gcc-patches@gcc.gnu.org Cc: Richard Biener , Joseph Myers , Marek Polacek , Martin Uecker , Hamza Mahfooz Subject: [PATCH RESEND] c: add -Wmissing-variable-declarations [PR65213] Date: Tue, 18 Jul 2023 15:14:31 -0400 Message-ID: <20230718191431.50059-1-someguy@effective-light.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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,RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,TXREP,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: 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 4abdc8d0e77..0ed87fcc7be 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1048,6 +1048,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 ecd10ebb69c..1f9eb44dbaa 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 88e3c625030..c2a0562b9e6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -498,8 +498,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} @@ -9610,6 +9610,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.41.0