aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-11-21 21:21:35 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-11-21 21:21:35 -0500
commit9127c38e118f34e261face580e21de592d46c7f3 (patch)
tree93241554a7aa78477ab871948ae4a4c3e2a615e6
parent0cd7c67283bcf3b0a443be9b6cdeaed7f6c1b8f3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-22.C12
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" }
+}