Hi,

this bug is a sort of follow up to 10416, which I fixed some time ago and was about avoiding -Wunused warnings for class types with destructors with side-effects.

In this issue reporter notes that we don't handle in the same way references, thus, considering the testcase, we do not warn for:

    Lock lock = AcquireLock();

and we do for:

    const Lock& lock = AcquireLock();

whereas the destructor is involved in both cases in a similar way, etc.

Thus I changed the code in poplevel to see through references for -Wunused-variable. Tested x86_64-linux.

Thanks,
Paolo.

////////////////////
/cp
2013-06-12  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/38958
        * decl.c (poplevel): For -Wunused-variable see through references.

/testsuite
2013-06-12  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/38958
        * g++.dg/warn/Wunused-var-20.C: New.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 200012)
+++ cp/decl.c   (working copy)
@@ -622,18 +622,22 @@ 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;
+       tree type = TREE_TYPE (decl);
+       if (VAR_P (decl) && ! TREE_USED (decl))
+         // For -Wunused-variable see through references (PR 38958).
+         type = non_reference (type);
        if (VAR_P (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))))
+           && type != error_mark_node
+           && (!CLASS_TYPE_P (type)
+               || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)))
          {
            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
+                    && TREE_CODE (type) != REFERENCE_TYPE
                     && errorcount == unused_but_set_errorcount)
              {
                warning (OPT_Wunused_but_set_variable,
Index: testsuite/g++.dg/warn/Wunused-var-20.C
===================================================================
--- testsuite/g++.dg/warn/Wunused-var-20.C      (revision 0)
+++ testsuite/g++.dg/warn/Wunused-var-20.C      (working copy)
@@ -0,0 +1,19 @@
+// PR c++/38958
+// { dg-options "-Wunused" }
+
+volatile int g;
+
+struct Lock
+{
+  ~Lock() { g = 0; }
+};
+
+Lock AcquireLock() { return Lock(); }
+
+int main()
+{
+  const Lock& lock = AcquireLock();
+  g = 1;
+  g = 2;
+  g = 3;
+}

Reply via email to