OSDN Git Service

(warn_if_unused_value): Handle arbitrary number of casts
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Nov 1993 21:51:04 +0000 (21:51 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Nov 1993 21:51:04 +0000 (21:51 +0000)
before a modify.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@6124 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/stmt.c

index 928e6cb..9795d8f 100644 (file)
@@ -1709,15 +1709,19 @@ warn_if_unused_value (exp)
       if (TREE_NO_UNUSED_WARNING (exp))
        return 0;
       /* Assignment to a cast usually results in a cast of a modify.
-        Don't complain about that.  */
-      if (TREE_CODE (TREE_OPERAND (exp, 0)) == MODIFY_EXPR)
-       return 0;
-      /* Sometimes it results in a cast of a cast of a modify.
-        Don't complain about that.  */
-      if ((TREE_CODE (TREE_OPERAND (exp, 0)) == CONVERT_EXPR
-          || TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR)
-         && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == MODIFY_EXPR)
-       return 0;
+        Don't complain about that.  There can be an arbitrary number of
+        casts before the modify, so we must loop until we find the first
+        non-cast expression and then test to see if that is a modify.  */
+      {
+       tree tem = TREE_OPERAND (exp, 0);
+
+       while (TREE_CODE (tem) == CONVERT_EXPR || TREE_CODE (tem) == NOP_EXPR)
+         tem = TREE_OPERAND (tem, 0);
+
+       if (TREE_CODE (tem) == MODIFY_EXPR)
+         return 0;
+      }
+      /* ... fall through ... */
 
     default:
       /* Referencing a volatile value is a side effect, so don't warn.  */