From 3f273c8a53e786389658f14a0316e48a5e0de0b6 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 17 Oct 2009 11:05:35 +0000 Subject: [PATCH] utils2.c (build_binary_op): Make sure the element type is consistent. * gcc-interface/utils2.c (build_binary_op) : Make sure the element type is consistent. From-SVN: r152934 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/utils2.c | 6 ++++++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gnat.dg/slice8.adb | 13 +++++++++++++ gcc/testsuite/gnat.dg/slice8_pkg1.ads | 3 +++ gcc/testsuite/gnat.dg/slice8_pkg2.ads | 23 +++++++++++++++++++++++ gcc/testsuite/gnat.dg/slice8_pkg3.adb | 17 +++++++++++++++++ gcc/testsuite/gnat.dg/slice8_pkg3.ads | 11 +++++++++++ 8 files changed, 85 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/slice8.adb create mode 100644 gcc/testsuite/gnat.dg/slice8_pkg1.ads create mode 100644 gcc/testsuite/gnat.dg/slice8_pkg2.ads create mode 100644 gcc/testsuite/gnat.dg/slice8_pkg3.adb create mode 100644 gcc/testsuite/gnat.dg/slice8_pkg3.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d74fccebda6..80103fb053a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2009-10-17 Eric Botcazou + + * gcc-interface/utils2.c (build_binary_op) : Mak + sure the element type is consistent. + 2009-10-17 Eric Botcazou * gcc-interface/trans.c (addressable_p): Handle bitwise operations. diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index fcd9ecd1253..7176740f453 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -755,6 +755,12 @@ build_binary_op (enum tree_code op_code, tree result_type, left_type = TREE_TYPE (left_operand); } + /* For a range, make sure the element type is consistent. */ + if (op_code == ARRAY_RANGE_REF + && TREE_TYPE (operation_type) != TREE_TYPE (left_type)) + operation_type = build_array_type (TREE_TYPE (left_type), + TYPE_DOMAIN (operation_type)); + /* Then convert the right operand to its base type. This will prevent unneeded sign conversions when sizetype is wider than integer. */ right_operand = convert (right_base_type, right_operand); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 217c0d71861..acbbe361915 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-10-17 Eric Botcazou + + * gnat.dg/slice8.adb: New test. + * gnat.dg/slice8_pkg1.ads: New helper. + * gnat.dg/slice8_pkg2.ads: Likewise. + * gnat.dg/slice8_pkg3.ad[sb]: Likewise. + 2009-10-17 Eric Botcazou * gnat.dg/unchecked_convert4.adb: New test. diff --git a/gcc/testsuite/gnat.dg/slice8.adb b/gcc/testsuite/gnat.dg/slice8.adb new file mode 100644 index 00000000000..b05829d0f7b --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice8.adb @@ -0,0 +1,13 @@ +-- { dg-do compile } +-- { dg-options "-gnatws" } + +with Slice8_Pkg1; +with Slice8_Pkg3; + +procedure Slice8 is + + package Bp is new Slice8_Pkg3 (Slice8_Pkg1); + +begin + null; +end; diff --git a/gcc/testsuite/gnat.dg/slice8_pkg1.ads b/gcc/testsuite/gnat.dg/slice8_pkg1.ads new file mode 100644 index 00000000000..3f433fdfb26 --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice8_pkg1.ads @@ -0,0 +1,3 @@ +with Slice8_Pkg2; + +package Slice8_Pkg1 is new Slice8_Pkg2 (Line_Length => 132, Max_Lines => 1000); diff --git a/gcc/testsuite/gnat.dg/slice8_pkg2.ads b/gcc/testsuite/gnat.dg/slice8_pkg2.ads new file mode 100644 index 00000000000..a6eafc6aa18 --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice8_pkg2.ads @@ -0,0 +1,23 @@ +generic + + Line_Length : Natural; + Max_Lines : Natural; + +package Slice8_Pkg2 is + + Subtype Index is Natural Range 0..Line_length; + Subtype Line_Count is Natural Range 0..Max_Lines; + + Type Line (Size : Index := 0) is + Record + Data : String (1..Size); + End Record; + + Type Lines is Array (Line_Count Range <>) of Line; + + Type Paragraph (Size : Line_Count) is + Record + Data : Lines (1..Size); + End Record; + +end Slice8_Pkg2; diff --git a/gcc/testsuite/gnat.dg/slice8_pkg3.adb b/gcc/testsuite/gnat.dg/slice8_pkg3.adb new file mode 100644 index 00000000000..3524de1f0f5 --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice8_pkg3.adb @@ -0,0 +1,17 @@ +-- { dg-do compile } +-- { dg-options "-gnatws" } + +package body Slice8_Pkg3 is + + Current : Str.Lines (Str.Line_Count); + Last : Natural := 0; + + function Get return Str.Paragraph is + Result : constant Str.Paragraph := (Size => Last, + Data => Current (1..Last)); + begin + Last := 0; + return Result; + end Get; + +end Slice8_Pkg3; diff --git a/gcc/testsuite/gnat.dg/slice8_pkg3.ads b/gcc/testsuite/gnat.dg/slice8_pkg3.ads new file mode 100644 index 00000000000..a802cb72d9b --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice8_pkg3.ads @@ -0,0 +1,11 @@ +with Slice8_Pkg2; + +generic + + with package Str is new Slice8_Pkg2 (<>); + +package Slice8_Pkg3 is + + function Get return Str.Paragraph; + +end Slice8_Pkg3; -- 2.30.2