re PR c++/63657 (-Wunused-variable: warning supressed by virtual dtor)
authorJason Merrill <jason@redhat.com>
Sat, 22 Nov 2014 02:21:35 +0000 (21:21 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 22 Nov 2014 02:21:35 +0000 (21:21 -0500)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/decl.c
gcc/testsuite/g++.dg/warn/Wunused-var-22.C [new file with mode: 0644]

index b1d9cea6ed727ea1b8b48b26b342ea6f47d790c0..6cc7e62097034398475208498a48ddd3249adef9 100644 (file)
@@ -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.
index 5cda1b1ee2bb35db1cc630214115db7e34a72226..a7a8667b5f8953d32db3754e8683b1b6ec669777 100644 (file)
@@ -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;
index 899637f68f42526c55ddecc6925545981afbb61c..225d4089882e8aab13cb6894a50c55a7094a91a7 100644 (file)
@@ -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 (file)
index 0000000..8ae46c1
--- /dev/null
@@ -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" }
+}