]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/10416 ('unused variable' warning ignores ctor/dtor side-effects)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 20 Aug 2012 17:38:53 +0000 (17:38 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 20 Aug 2012 17:38:53 +0000 (17:38 +0000)
/cp
2012-08-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/10416
* decl.c (poplevel): Check TYPE_HAS_NONTRIVIAL_DESTRUCTOR for
Wunused_variable too.

/testsuite
2012-08-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/10416
* g++.dg/warn/Wunused-var-17.C: New.

From-SVN: r190538

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

index 5c4f362f24d5cc61e76fb077a916c3d18d332c98..2ac0debfe5d25929831466b554c95ee6126e2a18 100644 (file)
@@ -1,3 +1,9 @@
+2012-08-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/10416
+       * decl.c (poplevel): Check TYPE_HAS_NONTRIVIAL_DESTRUCTOR for
+       Wunused_variable too.
+
 2012-08-20  Diego Novillo  <dnovillo@google.com>
 
        * decl.c (poplevel): Start TV_NAME_LOOKUP conditionally.
index 0dad597c9aca2dd5a123c6ae20216eb834511c2d..365ca9420045ceb3e8afae1ffbd2317f9a8eaed0 100644 (file)
@@ -621,16 +621,16 @@ poplevel (int keep, int reverse, int functionbody)
       if (TREE_CODE (decl) == VAR_DECL
          && (! TREE_USED (decl) || !DECL_READ_P (decl))
          && ! DECL_IN_SYSTEM_HEADER (decl)
-         && DECL_NAME (decl) && ! DECL_ARTIFICIAL (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_TYPE (decl) != error_mark_node
                   && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE
-                  && errorcount == unused_but_set_errorcount
-                  && (!CLASS_TYPE_P (TREE_TYPE (decl))
-                      || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))))
+                  && errorcount == unused_but_set_errorcount)
            {
              warning (OPT_Wunused_but_set_variable,
                       "variable %q+D set but not used", decl); 
index 3ff68d8de673ebda4687794bb99369543a5f50df..686e041f1d92b5a272bafad5150f3cf956a595ce 100644 (file)
@@ -1,3 +1,8 @@
+2012-08-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/10416
+       * g++.dg/warn/Wunused-var-17.C: New.
+
 2012-08-20  Patrick Marlier  <patrick.marlier@gmail.com>
 
        PR middle-end/53992
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-17.C b/gcc/testsuite/g++.dg/warn/Wunused-var-17.C
new file mode 100644 (file)
index 0000000..01650e1
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/10416
+// { dg-options "-Wunused" }
+
+void f () { struct atend { ~atend () { __builtin_printf("leaving f\n"); } } a; }