diff options
author | Hamza Mahfooz <someguy@effective-light.com> | 2023-07-31 19:03:47 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2023-07-31 19:03:47 +0000 |
commit | ffc74822468a39324722eef4c4412ea3224ca976 (patch) | |
tree | 7b257346376759ccd7b4a037bbcbe8a02af21cbd /gcc/c/c-decl.cc | |
parent | ac0e0966ebf08c454d53042a649403e2880ccbc1 (diff) | |
download | gcc-ffc74822468a39324722eef4c4412ea3224ca976.zip gcc-ffc74822468a39324722eef4c4412ea3224ca976.tar.gz gcc-ffc74822468a39324722eef4c4412ea3224ca976.tar.bz2 |
c: add -Wmissing-variable-declarations [PR65213]
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 <someguy@effective-light.com>
Diffstat (limited to 'gcc/c/c-decl.cc')
-rw-r--r-- | gcc/c/c-decl.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index ecd10eb..1f9eb44 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 |