diff mbox

[C++] Fix -Wunused-* regression (PR c++/71442)

Message ID 20160607152334.GT7387@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek June 7, 2016, 3:23 p.m. UTC
Hi!

Marek has recently added code to set TREE_USED bits on the elements of
TREE_VEC referenced in SIZEOF_EXPR.
But, as the testcase shows, it can be used on various parameter/argument
packs, some of them have types as elements, others decls.
And IMHO we want to set TREE_USED only on the decls listed in those,
for types TREE_USED should be a property of the type regardless of whether
the type is mentioned in sizeof... or not, otherwise we suddenly stop
diagnosing any unused vars with those types.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/6.2/5.5?

2016-06-07  Jakub Jelinek  <jakub@redhat.com>

	PR c++/71442
	* pt.c (tsubst_copy): Only set TREE_USED on DECLs.

	* g++.dg/cpp0x/Wunused-variable-1.C: New test.


	Jakub
diff mbox

Patch

--- gcc/cp/pt.c.jj	2016-06-01 14:17:12.000000000 +0200
+++ gcc/cp/pt.c	2016-06-07 14:29:16.608041125 +0200
@@ -14160,7 +14160,8 @@  tsubst_copy (tree t, tree args, tsubst_f
 	      len = TREE_VEC_LENGTH (expanded);
 	      /* Set TREE_USED for the benefit of -Wunused.  */
 	      for (int i = 0; i < len; i++)
-		TREE_USED (TREE_VEC_ELT (expanded, i)) = true;
+		if (DECL_P (TREE_VEC_ELT (expanded, i)))
+		  TREE_USED (TREE_VEC_ELT (expanded, i)) = true;
 	    }
 
 	  if (expanded == error_mark_node)
--- gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C.jj	2016-06-07 14:31:15.514486508 +0200
+++ gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C	2016-06-07 14:32:13.526730026 +0200
@@ -0,0 +1,25 @@ 
+// PR c++/71442
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-variable" }
+
+struct C
+{
+  template<typename... Ts>
+  int operator()(Ts &&...)
+  {
+    return sizeof...(Ts);
+  }
+};
+
+int
+main ()
+{
+  C {} (1, 1L, 1LL, 1.0);
+  char a;		// { dg-warning "unused variable" }
+  short b;		// { dg-warning "unused variable" }
+  int c;		// { dg-warning "unused variable" }
+  long d;		// { dg-warning "unused variable" }
+  long long e;		// { dg-warning "unused variable" }
+  float f;		// { dg-warning "unused variable" }
+  double g;		// { dg-warning "unused variable" }
+}