re PR tree-optimization/78586 (Wrong code caused by printf-return-value)
authorJakub Jelinek <jakub@redhat.com>
Thu, 1 Dec 2016 23:15:57 +0000 (00:15 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 1 Dec 2016 23:15:57 +0000 (00:15 +0100)
PR tree-optimization/78586
* gimple-ssa-sprintf.c (format_integer): Don't handle NOP_EXPR,
CONVERT_EXPR or COMPONENT_REF here.  Formatting fix.  For
SSA_NAME_DEF_STMT with NOP_EXPR only change argtype if the rhs1's
type is INTEGER_TYPE or POINTER_TYPE.

From-SVN: r243145

gcc/ChangeLog
gcc/gimple-ssa-sprintf.c

index 7f9dd0e2ed2f7d77d53d1fdab3b17f620e5551fc..c3170c0ebf3cc2ce4069f743bd0acf1eb1dc289a 100644 (file)
@@ -1,3 +1,11 @@
+2016-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/78586
+       * gimple-ssa-sprintf.c (format_integer): Don't handle NOP_EXPR,
+       CONVERT_EXPR or COMPONENT_REF here.  Formatting fix.  For
+       SSA_NAME_DEF_STMT with NOP_EXPR only change argtype if the rhs1's
+       type is INTEGER_TYPE or POINTER_TYPE.
+
 2016-12-01  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        PR target/78577
index 99a635a77fb1cd58774e6707b50a03b16b72a8fd..e86c4dc71e1d5ac9b0beadccd00e949873509bdd 100644 (file)
@@ -968,24 +968,13 @@ format_integer (const conversion_spec &spec, tree arg)
     }
   else if (TREE_CODE (TREE_TYPE (arg)) == INTEGER_TYPE
           || TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE)
-    {
-      /* Determine the type of the provided non-constant argument.  */
-      if (TREE_CODE (arg) == NOP_EXPR)
-       arg = TREE_OPERAND (arg, 0);
-      else if (TREE_CODE (arg) == CONVERT_EXPR)
-       arg = TREE_OPERAND (arg, 0);
-      if (TREE_CODE (arg) == COMPONENT_REF)
-       arg = TREE_OPERAND (arg, 1);
-
-      argtype = TREE_TYPE (arg);
-    }
+    /* Determine the type of the provided non-constant argument.  */
+    argtype = TREE_TYPE (arg);
   else
-    {
-      /* Don't bother with invalid arguments since they likely would
-        have already been diagnosed, and disable any further checking
-        of the format string by returning [-1, -1].  */
-      return fmtresult ();
-    }
+    /* Don't bother with invalid arguments since they likely would
+       have already been diagnosed, and disable any further checking
+       of the format string by returning [-1, -1].  */
+    return fmtresult ();
 
   fmtresult res;
 
@@ -1059,7 +1048,12 @@ format_integer (const conversion_spec &spec, tree arg)
                }
 
              if (code == NOP_EXPR)
-               argtype = TREE_TYPE (gimple_assign_rhs1 (def));
+               {
+                 tree type = TREE_TYPE (gimple_assign_rhs1 (def));
+                 if (TREE_CODE (type) == INTEGER_TYPE
+                     || TREE_CODE (type) == POINTER_TYPE)
+                   argtype = type;
+               }
            }
        }
     }