From: Jason Merrill Date: Tue, 19 Apr 2016 19:30:22 +0000 (-0400) Subject: PR c++/66543 - -Wunused-but-set* false positives X-Git-Tag: basepoints/gcc-8~7585 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=76f3944041f68df765cef48819936be04227d696;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7ff3dc573254..73b1cfa21a0e 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 702b717d7abe..61b395300e60 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 f9a9d990a46c..e18422f37ecc 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 56864b4395c5..85ef9934e96f 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 000000000000..ff1dda537d62 --- /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 000000000000..867ad6a2904c --- /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 000000000000..924b2dbc68e5 --- /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 000000000000..959e79cc4164 --- /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<>(); +}