diff options
author | Le-Chun Wu <lcwu@google.com> | 2016-10-31 13:21:59 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2016-10-31 13:21:59 +0000 |
commit | 84ff4775d41b716c1b862d4d91ff69127686b668 (patch) | |
tree | 37de03a0d419a258e63aa73193cee37e6d221b31 /gcc/c/c-decl.c | |
parent | 651795857809d5e504aa577c3912b98f4feaf397 (diff) | |
download | gcc-84ff4775d41b716c1b862d4d91ff69127686b668.zip gcc-84ff4775d41b716c1b862d4d91ff69127686b668.tar.gz gcc-84ff4775d41b716c1b862d4d91ff69127686b668.tar.bz2 |
Add -Wshadow=global -Wshadow=local and -Wshadow=compatible-local.
This patch from Le-Chun Wu adds two new shadow warning flags for
C and C++:
-Wshadow=local which warns if a local variable shadows another local
variable or parameter,
-Wshadow=compatible-local which warns if a local variable shadows
another local variable or parameter whose type is compatible with
that of the shadowing variable.
It is already on the google/main branch (Google ref 39127) and was
previously submitted by Diego Novillo and reviewed on
http://codereview.appspot.com/4452058
I addressed the review comments and made the following changes:
- Add -Wshadow=global (the default alias for -Wshadow).
- Make the documented options -Wshadow=global, -Wshadow=local
and -Wshadow=compatible-local (with hidden undocumented aliases
-Wshadow-local and -Wshadow-compatible-local for compatibility).
- The -Wshadow=global, -Wshadow=local and -Wshadow=compatible-local
relationships are expressed in common.opt instead of in opts.c
and documented in invoke.texi.
- The "previous declaration" warnings were turned into notes and use
the (now) existing infrastructure instead of duplicating the warnings.
The testcases have been adjusted to expect the notes.
- The conditional change in name-lookup.c for non-locals (where we
don't want to change the warnings, but just check the global ones)
has been dropped.
- Use warning_at in c-decl.c (warn_if_shadowing).
gcc/ChangeLog:
2016-10-30 Le-Chun Wu <lcwu@google.com>
Mark Wielaard <mjw@redhat.com>
* doc/invoke.texi: Document Wshadow-local and Wshadow-compatible-local.
* common.opt (Wshadow=global): New option. Default for -Wshadow.
(Wshadow=local): New option.
(Wshadow-local): Hidden alias for -Wshadow=local.
(Wshadow=compatible-local): New option.
(Wshadow-compatible-local): Hidden alias for
-Wshadow=compatible-local.
* doc/invoke.texi: Document Wshadow=global, Wshadow=local and
Wshadow=compatible-local.
gcc/c/ChangeLog:
2016-10-30 Le-Chun Wu <lcwu@google.com>
Mark Wielaard <mjw@redhat.com>
* c-decl.c (warn_if_shadowing): Use the warning code corresponding
to the given -Wshadow= variant. Use warning_at.
gcc/cp/ChangeLog:
2016-10-30 Le-Chun Wu <lcwu@google.com>
Mark Wielaard <mjw@redhat.com>
* name-lookup.c (pushdecl_maybe_friend): When emitting a
shadowing warning, use the code corresponding to the
given -Wshadow= variant.
gcc/testsuite/ChangeLog
2016-10-30 Le-Chun Wu <lcwu@google.com>
Mark Wielaard <mjw@redhat.com>
* gcc.dg/Wshadow-compatible-local-1.c: New test.
* gcc.dg/Wshadow-local-1.c: Likewise.
* gcc.dg/Wshadow-local-2.c: Likewise.
* g++.dg/warn/Wshadow-compatible-local-1.C: Likewise.
* g++.dg/warn/Wshadow-local-1.C: Likewise.
* g++.dg/warn/Wshadow-local-2.C: Likewise.
Co-Authored-By: Mark Wielaard <mjw@redhat.com>
From-SVN: r241699
Diffstat (limited to 'gcc/c/c-decl.c')
-rw-r--r-- | gcc/c/c-decl.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 136f304..3e1b7a4 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2735,7 +2735,9 @@ warn_if_shadowing (tree new_decl) struct c_binding *b; /* Shadow warnings wanted? */ - if (!warn_shadow + if (!(warn_shadow + || warn_shadow_local + || warn_shadow_compatible_local) /* No shadow warnings for internally generated vars. */ || DECL_IS_BUILTIN (new_decl) /* No shadow warnings for vars made for inlining. */ @@ -2759,9 +2761,23 @@ warn_if_shadowing (tree new_decl) break; } else if (TREE_CODE (old_decl) == PARM_DECL) - warned = warning (OPT_Wshadow, - "declaration of %q+D shadows a parameter", - new_decl); + { + enum opt_code warning_code; + + /* If '-Wshadow=compatible-local' is specified without other + -Wshadow= flags, we will warn only when the types of the + shadowing variable (i.e. new_decl) and the shadowed variable + (old_decl) are compatible. */ + if (warn_shadow) + warning_code = OPT_Wshadow; + else if (comptypes (TREE_TYPE (old_decl), TREE_TYPE (new_decl))) + warning_code = OPT_Wshadow_compatible_local; + else + warning_code = OPT_Wshadow_local; + warned = warning_at (DECL_SOURCE_LOCATION (new_decl), warning_code, + "declaration of %qD shadows a parameter", + new_decl); + } else if (DECL_FILE_SCOPE_P (old_decl)) { /* Do not warn if a variable shadows a function, unless @@ -2784,8 +2800,23 @@ warn_if_shadowing (tree new_decl) break; } else - warned = warning (OPT_Wshadow, "declaration of %q+D shadows a " - "previous local", new_decl); + { + enum opt_code warning_code; + + /* If '-Wshadow=compatible-local' is specified without other + -Wshadow= flags, we will warn only when the types of the + shadowing variable (i.e. new_decl) and the shadowed variable + (old_decl) are compatible. */ + if (warn_shadow) + warning_code = OPT_Wshadow; + else if (comptypes (TREE_TYPE (old_decl), TREE_TYPE (new_decl))) + warning_code = OPT_Wshadow_compatible_local; + else + warning_code = OPT_Wshadow_local; + warned = warning_at (DECL_SOURCE_LOCATION (new_decl), warning_code, + "declaration of %qD shadows a previous local", + new_decl); + } if (warned) inform (DECL_SOURCE_LOCATION (old_decl), |