diff options
author | Dodji Seketeli <dodji@redhat.com> | 2012-09-28 12:51:30 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2012-09-28 14:51:30 +0200 |
commit | 3b4441db79de403b90038af98f8641c19ff0953b (patch) | |
tree | 62e97833b7985d32ad245d045f3f22483e828606 /gcc | |
parent | 2be9064dedcf93581e0596151454573d8c37f8be (diff) | |
download | gcc-3b4441db79de403b90038af98f8641c19ff0953b.zip gcc-3b4441db79de403b90038af98f8641c19ff0953b.tar.gz gcc-3b4441db79de403b90038af98f8641c19ff0953b.tar.bz2 |
PR c++/29028 - Missed unused warning on using declaration
In the example of the patch, g++ fails to warn that the variable N::i
(introduced via a using declaration) is unused.
This is because as we want to emit the warning in poplevel, when we
walk the local bindings returned by getdecls, we forget that a
VAR_DECL introduced by a using declaration is represented by a
TREE_LIST which TREE_VALUE is the VAR_DECL, and we wrongly look for a
bare VAR_DECL.
Fixed thus and tested on x86_64-unknown-linux-gnu against trunk.
gcc/cp/
* decl.c (poplevel<warn_unused*>): Do not forget that some local
bindings are represented by a TREE_LIST.
gcc/testsuite/
* g++.dg/warn/Wunused-var-18.C: New test.
From-SVN: r191829
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 46 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-var-18.C | 14 |
4 files changed, 51 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7832590..3ba5de4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2012-09-25 Dodji Seketeli <dodji@redhat.com> + PR c++/29028 - Missed unused warning on using declaration + * decl.c (poplevel<warn_unused*>): Do not forget that some local + bindings are represented by a TREE_LIST. + +2012-09-25 Dodji Seketeli <dodji@redhat.com> + PR c++/53551 - -Wunused-local-typedefs misses uses * decl.c (make_typename_type): Record the use of typedefs. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index a7bb937..078b148 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -617,26 +617,32 @@ poplevel (int keep, int reverse, int functionbody) /* Before we remove the declarations first check for unused variables. */ if ((warn_unused_variable || warn_unused_but_set_variable) && !processing_template_decl) - for (decl = getdecls (); decl; decl = TREE_CHAIN (decl)) - if (TREE_CODE (decl) == VAR_DECL - && (! TREE_USED (decl) || !DECL_READ_P (decl)) - && ! DECL_IN_SYSTEM_HEADER (decl) - && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl) - && TREE_TYPE (decl) != error_mark_node - && (!CLASS_TYPE_P (TREE_TYPE (decl)) - || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) - { - if (! TREE_USED (decl)) - warning (OPT_Wunused_variable, "unused variable %q+D", decl); - else if (DECL_CONTEXT (decl) == current_function_decl - && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE - && errorcount == unused_but_set_errorcount) - { - warning (OPT_Wunused_but_set_variable, - "variable %q+D set but not used", decl); - unused_but_set_errorcount = errorcount; - } - } + for (tree d = getdecls (); d; d = TREE_CHAIN (d)) + { + /* There are cases where D itself is a TREE_LIST. See in + push_local_binding where the list of decls returned by + getdecls is built. */ + decl = TREE_CODE (d) == TREE_LIST ? TREE_VALUE (d) : d; + if (TREE_CODE (decl) == VAR_DECL + && (! TREE_USED (decl) || !DECL_READ_P (decl)) + && ! DECL_IN_SYSTEM_HEADER (decl) + && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl) + && TREE_TYPE (decl) != error_mark_node + && (!CLASS_TYPE_P (TREE_TYPE (decl)) + || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) + { + if (! TREE_USED (decl)) + warning (OPT_Wunused_variable, "unused variable %q+D", decl); + else if (DECL_CONTEXT (decl) == current_function_decl + && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE + && errorcount == unused_but_set_errorcount) + { + warning (OPT_Wunused_but_set_variable, + "variable %q+D set but not used", decl); + unused_but_set_errorcount = errorcount; + } + } + } /* Remove declarations for all the DECLs in this level. */ for (link = decls; link; link = TREE_CHAIN (link)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e9bd0b3..407184d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2012-09-25 Dodji Seketeli <dodji@redhat.com> + PR c++/29028 - Missed unused warning on using declaration + * g++.dg/warn/Wunused-var-18.C: New test. + +2012-09-25 Dodji Seketeli <dodji@redhat.com> + PR c++/53551 - -Wunused-local-typedefs misses uses * g++.dg/warn/Wunused-local-typedefs-2.C: New test. diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-18.C b/gcc/testsuite/g++.dg/warn/Wunused-var-18.C new file mode 100644 index 0000000..0339663 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-18.C @@ -0,0 +1,14 @@ +// Origin: PR c++/29028 +// { dg-options "-Wunused" } +// { dg-do compile } + +namespace N +{ + int i; // { dg-warning "unused variable" } +} + +void +f () +{ + using N::i; +} |