PR c++/66543 - -Wunused-but-set* false positives
authorJason Merrill <jason@redhat.com>
Tue, 19 Apr 2016 19:30:22 +0000 (15:30 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 19 Apr 2016 19:30:22 +0000 (15:30 -0400)
* expr.c (mark_exp_read): Handle NON_DEPENDENT_EXPR.
* pt.c (make_pack_expansion): Call mark_exp_read.
* semantics.c (finish_id_expression): Call mark_type_use in
unevaluated context.

From-SVN: r235221

gcc/cp/ChangeLog
gcc/cp/expr.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/warn/Wunused-parm-7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wunused-parm-8.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wunused-var-24.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wunused-var-25.C [new file with mode: 0644]

index 7ff3dc573254353d5bbd55ec7a68237d47917a16..73b1cfa21a0e2ed4955d2d4bf34708ced2f98019 100644 (file)
@@ -1,5 +1,11 @@
 2016-04-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/66543
+       * expr.c (mark_exp_read): Handle NON_DEPENDENT_EXPR.
+       * pt.c (make_pack_expansion): Call mark_exp_read.
+       * semantics.c (finish_id_expression): Call mark_type_use in
+       unevaluated context.
+
        DR 2137
        * call.c (implicit_conversion): If we choose a copy constructor
        for list-initialization from the same type, the conversion is an
index 702b717d7abe0245425114dde2080a612f405dad..61b395300e60e49cbf578b8b6dc9a839dfa4dd59 100644 (file)
@@ -145,6 +145,7 @@ mark_exp_read (tree exp)
     case ADDR_EXPR:
     case INDIRECT_REF:
     case FLOAT_EXPR:
+    case NON_DEPENDENT_EXPR:
       mark_exp_read (TREE_OPERAND (exp, 0));
       break;
     case COMPOUND_EXPR:
index f9a9d990a46ce92ba311324aabf3410b686aace0..e18422f37ecc889eaaa05a8ddafddd1f0d4f60fd 100644 (file)
@@ -3696,6 +3696,8 @@ make_pack_expansion (tree arg)
       /* Propagate type and const-expression information.  */
       TREE_TYPE (result) = TREE_TYPE (arg);
       TREE_CONSTANT (result) = TREE_CONSTANT (arg);
+      /* Mark this read now, since the expansion might be length 0.  */
+      mark_exp_read (arg);
     }
   else
     /* Just use structural equality for these TYPE_PACK_EXPANSIONS;
index 56864b4395c5e6ff0d039d7774ed31516c6f6c08..85ef9934e96f53908085ca2143377ae9fd20fcb2 100644 (file)
@@ -3487,6 +3487,12 @@ finish_id_expression (tree id_expression,
       if (!scope && decl != error_mark_node && identifier_p (id_expression))
        maybe_note_name_used_in_class (id_expression, decl);
 
+      /* A use in unevaluated operand might not be instantiated appropriately
+        if tsubst_copy builds a dummy parm, or if we never instantiate a
+        generic lambda, so mark it now.  */
+      if (processing_template_decl && cp_unevaluated_operand)
+       mark_type_use (decl);
+
       /* Disallow uses of local variables from containing functions, except
         within lambda-expressions.  */
       if (outer_automatic_var_p (decl))
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C
new file mode 100644 (file)
index 0000000..ff1dda5
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-but-set-parameter" }
+
+template <typename... Ts> void sink(Ts...);
+
+struct A { int i; };
+
+template <int... I>
+void f(A a)
+{
+  return sink((a.i + I)...);
+}
+
+int main()
+{
+  f<>(A());
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C
new file mode 100644 (file)
index 0000000..867ad6a
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-parameter" }
+
+auto l = [](auto t) -> decltype(true ? t : 0) { return {}; };
+
+int main()
+{
+  l(42);
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-24.C b/gcc/testsuite/g++.dg/warn/Wunused-var-24.C
new file mode 100644 (file)
index 0000000..924b2db
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/66543
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-variable" }
+
+int main() {
+  auto f = []() { };
+  [=](auto) {
+    using Foo = decltype(f());
+  };
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-25.C b/gcc/testsuite/g++.dg/warn/Wunused-var-25.C
new file mode 100644 (file)
index 0000000..959e79c
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-variable" }
+
+template <int... I> struct A { };
+template <int... I>
+auto f()
+{
+  constexpr int ar[sizeof...(I)+1] = {I...};
+  return A<ar[I]...>();
+}
+
+int main()
+{
+  f<>();
+}