diff mbox

C++ PATCH to suppress bogus -Wunused warning for parameter packs (PR c++/68965)

Message ID 20160113165022.GK25528@redhat.com
State New
Headers show

Commit Message

Marek Polacek Jan. 13, 2016, 4:50 p.m. UTC
The problem in this PR is that we print bogus "unused parameter" warnings
for parameters of a parameter pack.  E.g. for
  auto count = [](auto&&... xs)
  {
    return sizeof...(xs);
  };
GCC issues
  warning: unused parameter 'xs#0'
  warning: unused parameter 'xs#1'
  warning: unused parameter 'xs#2'
  ...

This happens since <https://gcc.gnu.org/ml/gcc-patches/2015-11/msg02433.html>,
because now we aren't calling tsubst_copy that often.  But that means that
we're missing the mark_used call in tsubst_copy for those xs# parameters.
So to quash that -Wunused-parameter warning, I decided to set TREE_USED at the
place where we create those #xs parameters.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2016-01-13  Marek Polacek  <polacek@redhat.com>

	PR c++/68965
	* pt.c (tsubst_decl): Set TREE_USED.

	* g++.dg/cpp1y/parameter-pack-1.C: New test.


	Marek

Comments

Jason Merrill Jan. 13, 2016, 8:33 p.m. UTC | #1
On 01/13/2016 11:50 AM, Marek Polacek wrote:
> So to quash that -Wunused-parameter warning, I decided to set TREE_USED at the
> place where we create those #xs parameters.

Won't that cause false negatives when the parameter pack is never 
mentioned in the function?

Jason
Marek Polacek Jan. 13, 2016, 10:52 p.m. UTC | #2
On Wed, Jan 13, 2016 at 03:33:27PM -0500, Jason Merrill wrote:
> On 01/13/2016 11:50 AM, Marek Polacek wrote:
> >So to quash that -Wunused-parameter warning, I decided to set TREE_USED at the
> >place where we create those #xs parameters.
> 
> Won't that cause false negatives when the parameter pack is never mentioned
> in the function?

You mean that e.g. for 

auto fn = [](auto&&... xs)
{
};

int
main ()
{
  fn (1, 2, 3);
}

we won't print
z.cc:1:24: warning: unused parameter 'xs' [-Wunused-parameter]
anymore?  Unfortunately, we don't print that even without the patch :(.

	Marek
Jason Merrill Jan. 18, 2016, 4:17 p.m. UTC | #3
On 01/13/2016 05:52 PM, Marek Polacek wrote:
> On Wed, Jan 13, 2016 at 03:33:27PM -0500, Jason Merrill wrote:
>> On 01/13/2016 11:50 AM, Marek Polacek wrote:
>>> So to quash that -Wunused-parameter warning, I decided to set TREE_USED at the
>>> place where we create those #xs parameters.
>>
>> Won't that cause false negatives when the parameter pack is never mentioned
>> in the function?
>
> You mean that e.g. for
>
> auto fn = [](auto&&... xs)
> {
> };
>
> int
> main ()
> {
>    fn (1, 2, 3);
> }
>
> we won't print
> z.cc:1:24: warning: unused parameter 'xs' [-Wunused-parameter]
> anymore?  Unfortunately, we don't print that even without the patch :(.

But we do currently print

wa.C:1:24: warning: unused parameter ‘xs#0’ [-Wunused-parameter]
wa.C:1:24: warning: unused parameter ‘xs#1’ [-Wunused-parameter]
wa.C:1:24: warning: unused parameter ‘xs#2’ [-Wunused-parameter]

for that testcase, and I think your patch would remove this warning as well.

Jason
diff mbox

Patch

diff --git gcc/cp/pt.c gcc/cp/pt.c
index edec774..b9d4f59 100644
--- gcc/cp/pt.c
+++ gcc/cp/pt.c
@@ -11924,6 +11924,9 @@  tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 		/* Rename the parameter to include the index.  */
 		DECL_NAME (r)
 		  = make_ith_pack_parameter_name (DECL_NAME (r), i);
+
+		/* Set TREE_USED for the benefit of -Wunused.  */
+		TREE_USED (r) = true;
               }
             else if (!type)
               /* We're dealing with a normal parameter.  */
diff --git gcc/testsuite/g++.dg/cpp1y/parameter-pack-1.C gcc/testsuite/g++.dg/cpp1y/parameter-pack-1.C
index e69de29..8119b6e 100644
--- gcc/testsuite/g++.dg/cpp1y/parameter-pack-1.C
+++ gcc/testsuite/g++.dg/cpp1y/parameter-pack-1.C
@@ -0,0 +1,23 @@ 
+// PR c++/68965
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wall -Wextra" }
+
+auto count = [](auto&&... xs)
+{
+    return sizeof...(xs);
+};
+
+struct count_struct
+{
+    template<typename... Ts>
+    auto operator()(Ts&&... xs)
+    {
+        return sizeof...(xs);
+    }
+};
+
+int main()
+{
+    count(1,2,3,4,5,6,7);
+    count_struct{}(1,2,3,4,5,6,7);
+}