Hi!

When casting ints to other ints, CASE_CONVERT in mark_exp_read handles that
case, but for FLOAT_EXPR it doesn't.  I've tried other static casts, but
haven't found anything else that would fail similarly.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.7?

2012-12-11  Jakub Jelinek  <ja...@redhat.com>

        PR c++/55643
        * expr.c (mark_exp_read): Handle FLOAT_EXPR similarly to NOP_EXPR.

        * g++.dg/warn/Wunused-var-19.C: New test.

--- gcc/cp/expr.c.jj    2010-12-02 11:51:22.000000000 +0100
+++ gcc/cp/expr.c       2012-12-11 08:51:53.008992474 +0100
@@ -131,6 +131,7 @@ mark_exp_read (tree exp)
     CASE_CONVERT:
     case ADDR_EXPR:
     case INDIRECT_REF:
+    case FLOAT_EXPR:
       mark_exp_read (TREE_OPERAND (exp, 0));
       break;
     case COMPOUND_EXPR:
--- gcc/testsuite/g++.dg/warn/Wunused-var-19.C.jj       2012-12-11 
08:54:47.600958580 +0100
+++ gcc/testsuite/g++.dg/warn/Wunused-var-19.C  2012-12-11 08:53:20.000000000 
+0100
@@ -0,0 +1,26 @@
+// PR c++/55643
+// { dg-do compile }
+// { dg-options "-std=c++11 -Wunused" }
+
+enum class E { e = 123 };
+
+int
+foo ()
+{
+  E x = E::e;
+  return (double) x;
+}
+
+int
+bar ()
+{
+  E x = E::e;
+  return (long double) x;
+}
+
+int
+baz ()
+{
+  E x = E::e;
+  return (float) x;
+}

        Jakub

Reply via email to