summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-22 22:32:54 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-22 22:32:54 +0000
commiteac26e819860c68e5d5066821d257500a9f6bcc9 (patch)
treebeedd09a228d7c271f4269d3c601ccd2aa414c7e
parent477305bf5b3a361ab982a71f0bed0a994f00cb57 (diff)
downloadgcc-eac26e819860c68e5d5066821d257500a9f6bcc9.tar.gz
* gcc-interface/utils2.c (build_binary_op) <PLUS_EXPR>: If operation's
type is an enumeral or a boolean type, change it to an integer type with the same mode and signedness. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146625 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/utils2.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/enum2.adb11
-rw-r--r--gcc/testsuite/gnat.dg/enum2_pkg.ads8
5 files changed, 41 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index acdc11cfc85..6f31942e869 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
2009-04-22 Eric Botcazou <ebotcazou@adacore.com>
+ * gcc-interface/utils2.c (build_binary_op) <PLUS_EXPR>: If operation's
+ type is an enumeral or a boolean type, change it to an integer type
+ with the same mode and signedness.
+
+2009-04-22 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc-interface/utils.c (create_var_decl_1): Do not emit debug info
for an external constant whose initializer is not absolute.
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c
index 77a0389674d..d6b7d684de7 100644
--- a/gcc/ada/gcc-interface/utils2.c
+++ b/gcc/ada/gcc-interface/utils2.c
@@ -6,7 +6,7 @@
* *
* C Implementation File *
* *
- * Copyright (C) 1992-2008, Free Software Foundation, Inc. *
+ * Copyright (C) 1992-2009, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@@ -1010,11 +1010,15 @@ build_binary_op (enum tree_code op_code, tree result_type,
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;
+ /* Avoid doing arithmetics in ENUMERAL_TYPE or BOOLEAN_TYPE like the
+ other compilers. Contrary to C, Ada doesn't allow arithmetics in
+ these types but can generate addition/subtraction for Succ/Pred. */
+ if (operation_type
+ && (TREE_CODE (operation_type) == ENUMERAL_TYPE
+ || TREE_CODE (operation_type) == BOOLEAN_TYPE))
+ operation_type = left_base_type = right_base_type
+ = gnat_type_for_mode (TYPE_MODE (operation_type),
+ TYPE_UNSIGNED (operation_type));
/* ... fall through ... */
@@ -2199,7 +2203,7 @@ fill_vms_descriptor (tree expr, Entity_Id gnat_formal, Node_Id gnat_actual)
add_stmt (build3 (COND_EXPR, void_type_node,
build_binary_op (GE_EXPR, long_integer_type_node,
convert (long_integer_type_node,
- addr64expr),
+ addr64expr),
malloc64low),
build_call_raise (CE_Range_Check_Failed, gnat_actual,
N_Raise_Constraint_Error),
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7af7fccfe02..8002f79601a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-04-22 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/enum2.adb: New test.
+ * gnat.dg/enum2_pkg.ads: New helper.
+
2009-04-22 Jakub Jelinek <jakub@redhat.com>
PR c/39855
diff --git a/gcc/testsuite/gnat.dg/enum2.adb b/gcc/testsuite/gnat.dg/enum2.adb
new file mode 100644
index 00000000000..e98252a1926
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/enum2.adb
@@ -0,0 +1,11 @@
+-- { dg-do run }
+-- { dg-options "-gnat05 -O2" }
+
+with Enum2_Pkg; use Enum2_Pkg;
+
+procedure Enum2 is
+ type Enum is (A, B, C, D);
+ Table : array (B .. C, 1 .. 1) of F_String := (others => (others => Null_String));
+begin
+ Table := (others => (others => Null_String));
+end;
diff --git a/gcc/testsuite/gnat.dg/enum2_pkg.ads b/gcc/testsuite/gnat.dg/enum2_pkg.ads
new file mode 100644
index 00000000000..20112d23c5c
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/enum2_pkg.ads
@@ -0,0 +1,8 @@
+with Ada.Finalization; use Ada.Finalization;
+
+package Enum2_Pkg is
+ type F_String is new Controlled with record
+ Data : access String;
+ end record;
+ Null_String : constant F_String := (Controlled with Data => null);
+end Enum2_Pkg;