PR c++/82728 - wrong -Wunused-but-set-variable

PR c++/82799
	PR c++/83690
	* call.c (perform_implicit_conversion_flags): Call mark_rvalue_use.
	* decl.c (case_conversion): Likewise.
	* semantics.c (finish_static_assert): Call
	perform_implicit_conversion_flags.

From-SVN: r256550
This commit is contained in:
Jason Merrill 2018-01-11 14:08:41 -05:00 committed by Jason Merrill
parent c2893c6e1f
commit 03943bbd4a
8 changed files with 79 additions and 3 deletions

View File

@ -1,3 +1,13 @@
2018-01-11 Jason Merrill <jason@redhat.com>
PR c++/82728 - wrong -Wunused-but-set-variable
PR c++/82799
PR c++/83690
* call.c (perform_implicit_conversion_flags): Call mark_rvalue_use.
* decl.c (case_conversion): Likewise.
* semantics.c (finish_static_assert): Call
perform_implicit_conversion_flags.
2018-01-11 Nathan Sidwell <nathan@acm.org>
* method.c (enum mangling_flags): Delete long-dead enum.

View File

@ -10514,6 +10514,11 @@ perform_implicit_conversion_flags (tree type, tree expr,
void *p;
location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
if (TREE_CODE (type) == REFERENCE_TYPE)
expr = mark_lvalue_use (expr);
else
expr = mark_rvalue_use (expr);
if (error_operand_p (expr))
return error_mark_node;

View File

@ -3541,6 +3541,8 @@ case_conversion (tree type, tree value)
if (value == NULL_TREE)
return value;
value = mark_rvalue_use (value);
if (cxx_dialect >= cxx11
&& (SCOPED_ENUM_P (type)
|| !INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (value))))

View File

@ -8608,6 +8608,8 @@ void
finish_static_assert (tree condition, tree message, location_t location,
bool member_p)
{
tsubst_flags_t complain = tf_warning_or_error;
if (message == NULL_TREE
|| message == error_mark_node
|| condition == NULL_TREE
@ -8640,9 +8642,9 @@ finish_static_assert (tree condition, tree message, location_t location,
}
/* Fold the expression and convert it to a boolean value. */
condition = instantiate_non_dependent_expr (condition);
condition = cp_convert (boolean_type_node, condition, tf_warning_or_error);
condition = maybe_constant_value (condition);
condition = perform_implicit_conversion_flags (boolean_type_node, condition,
complain, LOOKUP_NORMAL);
condition = fold_non_dependent_expr (condition);
if (TREE_CODE (condition) == INTEGER_CST && !integer_zerop (condition))
/* Do nothing; the condition is satisfied. */

View File

@ -0,0 +1,18 @@
// PR c++/82728
// { dg-do compile { target c++11 } }
void
foo ()
{
const int i = 1;
[=]()
{
switch (0)
{
case i:
break;
}
static_assert (i, "i");
};
}

View File

@ -0,0 +1,14 @@
// PR c++/82728
// { dg-do compile }
// { dg-options "-Wunused-but-set-variable" }
void
foo ()
{
const int i = 1; // { dg-bogus "set but not used" }
switch (0)
{
case i:
break;
}
}

View File

@ -0,0 +1,15 @@
// PR c++/82799
// { dg-do compile }
// { dg-options "-Wunused-but-set-variable" }
enum E { b };
struct C {
template <E>
int foo ()
{
const bool i = 0; // { dg-bogus "set but not used" }
const int r = i ? 7 : 9;
return r;
}
void bar () { foo <b> (); }
};

View File

@ -0,0 +1,10 @@
// PR c++/83690
// { dg-do compile { target c++11 } }
// { dg-options "-Wunused-but-set-variable" }
void
foo ()
{
constexpr bool foo = true; // { dg-bogus "set but not used" }
static_assert (foo, "foo");
}