diff options
author | Jason Merrill <jason@redhat.com> | 2014-11-21 21:21:35 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-11-21 21:21:35 -0500 |
commit | 9127c38e118f34e261face580e21de592d46c7f3 (patch) | |
tree | 93241554a7aa78477ab871948ae4a4c3e2a615e6 | |
parent | 0cd7c67283bcf3b0a443be9b6cdeaed7f6c1b8f3 (diff) | |
download | gcc-9127c38e118f34e261face580e21de592d46c7f3.zip gcc-9127c38e118f34e261face580e21de592d46c7f3.tar.gz gcc-9127c38e118f34e261face580e21de592d46c7f3.tar.bz2 |
re PR c++/63657 (-Wunused-variable: warning supressed by virtual dtor)
PR c++/63657
PR c++/38958
* call.c (set_up_extended_ref_temp): Set TREE_USED on the reference
if the temporary has a non-trivial destructor.
* decl.c (poplevel): Don't look through references.
From-SVN: r217957
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 4 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-var-22.C | 12 |
4 files changed, 23 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b1d9cea..6cc7e62 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2014-11-21 Jason Merrill <jason@redhat.com> + PR c++/63657 + PR c++/38958 + * call.c (set_up_extended_ref_temp): Set TREE_USED on the reference + if the temporary has a non-trivial destructor. + * decl.c (poplevel): Don't look through references. + PR c++/63942 * name-lookup.c (supplement_binding_1): Override a mangling alias. * mangle.c (maybe_remove_implicit_alias): New. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5cda1b1..a7a8667 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -9622,6 +9622,10 @@ set_up_extended_ref_temp (tree decl, tree expr, vec<tree, va_gc> **cleanups, /* Check whether the dtor is callable. */ cxx_maybe_build_cleanup (var, tf_warning_or_error); } + /* Avoid -Wunused-variable warning (c++/38958). */ + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) + && TREE_CODE (decl) == VAR_DECL) + TREE_USED (decl) = DECL_READ_P (decl) = true; *initp = init; return var; diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 899637f..225d408 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -638,8 +638,7 @@ poplevel (int keep, int reverse, int functionbody) push_local_binding where the list of decls returned by getdecls is built. */ decl = TREE_CODE (d) == TREE_LIST ? TREE_VALUE (d) : d; - // See through references for improved -Wunused-variable (PR 38958). - tree type = non_reference (TREE_TYPE (decl)); + tree type = TREE_TYPE (decl); if (VAR_P (decl) && (! TREE_USED (decl) || !DECL_READ_P (decl)) && ! DECL_IN_SYSTEM_HEADER (decl) diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-22.C b/gcc/testsuite/g++.dg/warn/Wunused-var-22.C new file mode 100644 index 0000000..8ae46c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-22.C @@ -0,0 +1,12 @@ +// PR c++/63657 +// { dg-options "-Wunused-variable" } + +class Bar +{ + virtual ~Bar() {} +}; +Bar& getbar(); +void bar() +{ + Bar& b = getbar(); // { dg-warning "unused" } +} |