re PR c++/79746 (Confusing -Wunused-but-set-parameter warning with virtual inheritance)
authorJakub Jelinek <jakub@redhat.com>
Wed, 1 Mar 2017 08:35:55 +0000 (09:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 1 Mar 2017 08:35:55 +0000 (09:35 +0100)
PR c++/79746
* init.c (emit_mem_initializers): When not constructing vbases of
abstract classes, mark arguments as read for
-Wunused-but-set-parameter.

* g++.dg/warn/Wunused-parm-9.C: New test.

From-SVN: r245802

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wunused-parm-9.C [new file with mode: 0644]

index b0e589c812db5f76305862cbe2264e4dbcdd07a2..1c3f1e845e3c15782e94063177333f22fedfb74f 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79746
+       * init.c (emit_mem_initializers): When not constructing vbases of
+       abstract classes, mark arguments as read for
+       -Wunused-but-set-parameter.
+
 2017-02-28  Jason Merrill  <jason@redhat.com>
 
        Class template argument deduction refinements
index 55209634147777b08c4acc95567510644258ca8e..7ded37e753a850136a6f7948d643954ec18ff076 100644 (file)
@@ -1217,6 +1217,12 @@ emit_mem_initializers (tree mem_inits)
        /* C++14 DR1658 Means we do not have to construct vbases of
           abstract classes.  */
        construct_virtual_base (subobject, arguments);
+      else
+       /* When not constructing vbases of abstract classes, at least mark
+          the arguments expressions as read to avoid
+          -Wunused-but-set-parameter false positives.  */
+       for (tree arg = arguments; arg; arg = TREE_CHAIN (arg))
+         mark_exp_read (TREE_VALUE (arg));
 
       if (inherited_base)
        pop_deferring_access_checks ();
index 369233795c5a95fb1461a30bbb2d943b4e4f5df0..4cce6751ca8d2406cee48c830ea28ddf38f95f52 100644 (file)
@@ -1,5 +1,8 @@
 2017-03-01  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79746
+       * g++.dg/warn/Wunused-parm-9.C: New test.
+
        PR tree-optimization/79734
        * g++.dg/opt/pr79734.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-9.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-9.C
new file mode 100644 (file)
index 0000000..0dcc229
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/79746
+// { dg-do compile }
+// { dg-options "-Wunused-but-set-parameter" }
+
+struct A {
+  A (const char *x) : a(x) {}  // { dg-bogus "set but not used" }
+  virtual int foo () = 0;
+  const char *a;
+};
+struct B : public virtual A {
+  B (const char *x) : A(x) {}  // { dg-bogus "set but not used" }
+};