diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/c.opt | 4 | ||||
-rw-r--r-- | gcc/c/c-decl.cc | 10 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wmissing-variable-declarations.c | 33 |
4 files changed, 55 insertions, 3 deletions
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 4abdc8d..0ed87fc 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 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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index c43260f..104766f 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} @@ -9611,6 +9611,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 0000000..b292dbe --- /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; +} |