OSDN Git Service

* gcc-interface/utils2.c (build_binary_op) <PLUS_EXPR, MINUS_EXPR>:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Aug 2008 10:49:51 +0000 (10:49 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Aug 2008 10:49:51 +0000 (10:49 +0000)
New case.  Convert BOOLEAN_TYPE operation to the default integer type.

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

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils2.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/boolean_expr2.adb [new file with mode: 0644]

index 5819c49..ab0d02f 100644 (file)
@@ -1,3 +1,8 @@
+2008-08-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils2.c (build_binary_op) <PLUS_EXPR, MINUS_EXPR>:
+       New case.  Convert BOOLEAN_TYPE operation to the default integer type.
+
 2008-08-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/ada-tree.h (DECL_PARM_ALT): Now DECL_PARM_ALT_TYPE.
index 1424ac8..d1a6786 100644 (file)
@@ -986,7 +986,6 @@ build_binary_op (enum tree_code op_code, tree result_type,
         outputs.  */
       if (modulus && integer_pow2p (modulus))
        modulus = NULL_TREE;
-
       goto common;
 
     case COMPLEX_EXPR:
@@ -1011,6 +1010,15 @@ build_binary_op (enum tree_code op_code, tree result_type,
       right_operand = convert (sizetype, right_operand);
       break;
 
+    case PLUS_EXPR:
+    case MINUS_EXPR:
+      /* Avoid doing arithmetics in BOOLEAN_TYPE like the other compilers.
+        Contrary to C, Ada doesn't allow arithmetics in Standard.Boolean
+        but we can generate addition or subtraction for 'Succ and 'Pred.  */
+      if (operation_type && TREE_CODE (operation_type) == BOOLEAN_TYPE)
+       operation_type = left_base_type = right_base_type = integer_type_node;
+      goto common;
+
     default:
     common:
       /* The result type should be the same as the base types of the
index 4aacfda..b9f542a 100644 (file)
@@ -1,3 +1,7 @@
+2008-08-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/boolean_expr2.adb: New test.
+
 2008-08-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/36991
diff --git a/gcc/testsuite/gnat.dg/boolean_expr2.adb b/gcc/testsuite/gnat.dg/boolean_expr2.adb
new file mode 100644 (file)
index 0000000..8bdcb84
--- /dev/null
@@ -0,0 +1,18 @@
+-- { dg-do run }
+
+procedure Boolean_Expr2 is
+
+  function Ident_Bool (B : Boolean) return Boolean is
+  begin
+    return B;
+  end;
+
+begin
+  if Boolean'Succ (Ident_Bool(False)) /= True then
+    raise Program_Error;
+  end if;
+
+  if Boolean'Pred (Ident_Bool(True)) /= False then
+    raise Program_Error;
+  end if;
+end;