]> gcc.gnu.org Git - gcc.git/commitdiff
re PR ada/26797 (ACATS cxh1001 fails)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 12 Sep 2007 15:52:57 +0000 (15:52 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 12 Sep 2007 15:52:57 +0000 (15:52 +0000)
PR ada/26797
PR ada/32407
* utils.c (unchecked_convert): Use a subtype as the intermediate type
in the special VIEW_CONVERT_EXPR case.

From-SVN: r128441

gcc/ada/ChangeLog
gcc/ada/utils.c

index 303f5d94646c101ae2870affe5aaa3ed58e44c45..a0bf5126695007571b71e01f27aa60628d49f23b 100644 (file)
@@ -1,3 +1,10 @@
+2007-09-12  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR ada/26797
+       PR ada/32407
+       * utils.c (unchecked_convert): Use a subtype as the intermediate type
+       in the special VIEW_CONVERT_EXPR case.
+
 2007-09-12  Robert Dewar  <dewar@adacore.com>
 
        * types.ads, a-charac.ads, freeze.adb: Minor reformatting.
index 56d490073c4870aa76db5a3925c40f8bc761c6bd..0db4e78dc9f1eecb07dca685cdd4d99a3fec086b 100644 (file)
@@ -3808,7 +3808,7 @@ unchecked_convert (tree type, tree expr, bool notrunc_p)
          TYPE_MAIN_VARIANT (rtype) = rtype;
        }
 
-      /* We have another special case.  If we are unchecked converting subtype
+      /* We have another special case: if we are unchecked converting subtype
         into a base type, we need to ensure that VRP doesn't propagate range
         information since this conversion may be done precisely to validate
         that the object is within the range it is supposed to have.  */
@@ -3818,21 +3818,18 @@ unchecked_convert (tree type, tree expr, bool notrunc_p)
                   || TREE_CODE (etype) == ENUMERAL_TYPE
                   || TREE_CODE (etype) == BOOLEAN_TYPE))
        {
-         /* ??? The pattern to be "preserved" by the middle-end and the
-            optimizers is a VIEW_CONVERT_EXPR between a pair of different
-            "base" types (integer types without TREE_TYPE).  But this may
-            raise addressability/aliasing issues because VIEW_CONVERT_EXPR
-            gets gimplified as an lvalue, thus causing the address of its
-            operand to be taken if it is deemed addressable and not already
-            in GIMPLE form.  */
+         /* The optimization barrier is a VIEW_CONVERT_EXPR node; moreover,
+            in order not to be deemed an useless type conversion, it must
+            be from subtype to base type.
+
+            ??? This may raise addressability and/or aliasing issues because
+            VIEW_CONVERT_EXPR gets gimplified as an lvalue, thus causing the
+            address of its operand to be taken if it is deemed addressable
+            and not already in GIMPLE form.  */
          rtype = gnat_type_for_mode (TYPE_MODE (type), TYPE_UNSIGNED (type));
-
-         if (rtype == type)
-           {
-             rtype = copy_type (rtype);
-             TYPE_MAIN_VARIANT (rtype) = rtype;
-           }
-
+         rtype = copy_type (rtype);
+         TYPE_MAIN_VARIANT (rtype) = rtype;
+         TREE_TYPE (rtype) = type;
          final_unchecked = true;
        }
 
This page took 0.096115 seconds and 5 git commands to generate.