From 76f3944041f68df765cef48819936be04227d696 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 19 Apr 2016 15:30:22 -0400 Subject: [PATCH] PR c++/66543 - -Wunused-but-set* false positives * 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 | 6 ++++++ gcc/cp/expr.c | 1 + gcc/cp/pt.c | 2 ++ gcc/cp/semantics.c | 6 ++++++ gcc/testsuite/g++.dg/warn/Wunused-parm-7.C | 17 +++++++++++++++++ gcc/testsuite/g++.dg/warn/Wunused-parm-8.C | 9 +++++++++ gcc/testsuite/g++.dg/warn/Wunused-var-24.C | 10 ++++++++++ gcc/testsuite/g++.dg/warn/Wunused-var-25.C | 15 +++++++++++++++ 8 files changed, 66 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-parm-7.C create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-parm-8.C create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-var-24.C create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-var-25.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7ff3dc57325..73b1cfa21a0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2016-04-19 Jason Merrill + 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 diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 702b717d7ab..61b395300e6 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -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: diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f9a9d990a46..e18422f37ec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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; diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 56864b4395c..85ef9934e96 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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 index 00000000000..ff1dda537d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-but-set-parameter" } + +template void sink(Ts...); + +struct A { int i; }; + +template +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 index 00000000000..867ad6a2904 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C @@ -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 index 00000000000..924b2dbc68e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-24.C @@ -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 index 00000000000..959e79cc416 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-25.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++14 } } +// { dg-options "-Wunused-but-set-variable" } + +template struct A { }; +template +auto f() +{ + constexpr int ar[sizeof...(I)+1] = {I...}; + return A(); +} + +int main() +{ + f<>(); +}