public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Ada] Fix type consistency problem with slices
@ 2009-10-17 11:10 Eric Botcazou
  0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2009-10-17 11:10 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 983 bytes --]

The more strict type checking on mainline reveals that gigi builds non-type 
consistent slices in some cases, i.e. slices whose element type is not the 
same as the element type of the arrays they are part of.  This can happen 
when the original element type is a discriminated record type with default 
discriminant, because different padded types are built as effective element 
types for the array's type and for the slice's type.

Recycling padded types has turned to be quite tricky, so adding a conversion 
seems to be the best approach.

Tested on i586-suse-linux, applied on the mainline.


2009-10-17  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Make
	sure the element type is consistent.


2009-10-17  Eric Botcazou  <ebotcazou@adacore.com>

	* 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.


-- 
Eric Botcazou

[-- Attachment #2: slice8.adb --]
[-- Type: text/x-adasrc, Size: 177 bytes --]

-- { 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;

[-- Attachment #3: slice8_pkg1.ads --]
[-- Type: text/x-adasrc, Size: 99 bytes --]

with Slice8_Pkg2;

package Slice8_Pkg1 is new Slice8_Pkg2 (Line_Length => 132, Max_Lines => 1000);

[-- Attachment #4: slice8_pkg3.ads --]
[-- Type: text/x-adasrc, Size: 154 bytes --]

with Slice8_Pkg2;

generic

   with package Str is new Slice8_Pkg2 (<>);

package Slice8_Pkg3 is

   function Get return Str.Paragraph;

end Slice8_Pkg3;

[-- Attachment #5: slice8_pkg2.ads --]
[-- Type: text/x-adasrc, Size: 457 bytes --]

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;

[-- Attachment #6: slice8_pkg3.adb --]
[-- Type: text/x-adasrc, Size: 391 bytes --]

-- { 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;

[-- Attachment #7: p.diff --]
[-- Type: text/x-diff, Size: 777 bytes --]

Index: gcc-interface/utils2.c
===================================================================
--- gcc-interface/utils2.c	(revision 152917)
+++ gcc-interface/utils2.c	(working copy)
@@ -755,6 +755,12 @@ build_binary_op (enum tree_code op_code,
 	  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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-10-17 11:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-10-17 11:10 [Ada] Fix type consistency problem with slices Eric Botcazou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).