* convert.c (convert_to_integer): Don't assume an input pointer is
authorhainque <hainque@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Aug 2009 21:23:22 +0000 (21:23 +0000)
committerhainque <hainque@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Aug 2009 21:23:22 +0000 (21:23 +0000)
        POINTER_SIZE wide.  Fetch from the type instead.

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

gcc/ChangeLog
gcc/convert.c

index 420b313..2d03118 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-24  Olivier Hainque  <hainque@adacore.com>
+
+       * convert.c (convert_to_integer): Don't assume an input pointer is
+       POINTER_SIZE wide.  Fetch from the type instead.
+
 2009-08-24  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * configure.ac (AC_PREREQ): Bump to 2.64.
index f7ddfc9..a833418 100644 (file)
@@ -530,10 +530,13 @@ convert_to_integer (tree type, tree expr)
       if (integer_zerop (expr))
        return build_int_cst (type, 0);
 
-      /* Convert to an unsigned integer of the correct width first,
-        and from there widen/truncate to the required type.  */
+      /* Convert to an unsigned integer of the correct width first, and from
+        there widen/truncate to the required type.  Some targets support the
+        coexistence of multiple valid pointer sizes, so fetch the one we need
+        from the type.  */
       expr = fold_build1 (CONVERT_EXPR,
-                         lang_hooks.types.type_for_size (POINTER_SIZE, 0),
+                         lang_hooks.types.type_for_size
+                           (TYPE_PRECISION (intype), 0),
                          expr);
       return fold_convert (type, expr);