+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.
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;
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))))
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
}
/* 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. */
--- /dev/null
+// PR c++/82728
+// { dg-do compile { target c++11 } }
+
+void
+foo ()
+{
+ const int i = 1;
+
+ [=]()
+ {
+ switch (0)
+ {
+ case i:
+ break;
+ }
+ static_assert (i, "i");
+ };
+}
--- /dev/null
+// 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;
+ }
+}
--- /dev/null
+// 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> (); }
+};
--- /dev/null
+// 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");
+}