diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-22 22:32:54 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-22 22:32:54 +0000 |
commit | eac26e819860c68e5d5066821d257500a9f6bcc9 (patch) | |
tree | beedd09a228d7c271f4269d3c601ccd2aa414c7e | |
parent | 477305bf5b3a361ab982a71f0bed0a994f00cb57 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils2.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/enum2.adb | 11 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/enum2_pkg.ads | 8 |
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; |