aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-01-11 14:08:41 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-01-11 14:08:41 -0500
commit03943bbd4a468fb51b8a0102daa815c887a45711 (patch)
treed12a1dcfa3cae23d8b6a5ca567328d57a251cd47
parentc2893c6e1fbaef291cf69c4444cc45e77069eb3f (diff)
downloadgcc-03943bbd4a468fb51b8a0102daa815c887a45711.zip
gcc-03943bbd4a468fb51b8a0102daa815c887a45711.tar.gz
gcc-03943bbd4a468fb51b8a0102daa815c887a45711.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/semantics.c8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch2.C18
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-27.C14
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-28.C15
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-29.C10
8 files changed, 79 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8731982..840cbd4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c822a70..5f2c6be 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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;
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6ba6578..ee469d3 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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))))
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 60608c7..f9c5285 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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. */
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch2.C
new file mode 100644
index 0000000..677f305
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch2.C
@@ -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");
+ };
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-27.C b/gcc/testsuite/g++.dg/warn/Wunused-var-27.C
new file mode 100644
index 0000000..0ef7153
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-27.C
@@ -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;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-28.C b/gcc/testsuite/g++.dg/warn/Wunused-var-28.C
new file mode 100644
index 0000000..6960167
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-28.C
@@ -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> (); }
+};
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-29.C b/gcc/testsuite/g++.dg/warn/Wunused-var-29.C
new file mode 100644
index 0000000..24eeb95
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-29.C
@@ -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");
+}