This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Lift unexpected alignment restriction on modular types


Alignment clauses that specify a lower alignment than the natural one are 
unexpectedly rejected by the compiler.

Fixed thusly, tested on i586-suse-linux, applied on the mainline.


2010-07-03  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Enumeration_Type>:
	Branch to common code handling the alignment of discrete types.
	<E_Signed_Integer_Type>: Likewise.
	<E_Modular_Integer_Type>: Likewise.


2010-07-03  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/modular3.adb: New test.
	* gnat.dg/modular3_pkg.ads: New helper.


-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 161767)
+++ gcc-interface/decl.c	(working copy)
@@ -1496,7 +1496,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	/* Note that the bounds are updated at the end of this function
 	   to avoid an infinite recursion since they refer to the type.  */
       }
-      break;
+      goto discrete_type;
 
     case E_Signed_Integer_Type:
     case E_Ordinary_Fixed_Point_Type:
@@ -1504,7 +1504,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
       /* For integer types, just make a signed type the appropriate number
 	 of bits.  */
       gnu_type = make_signed_type (esize);
-      break;
+      goto discrete_type;
 
     case E_Modular_Integer_Type:
       {
@@ -1543,7 +1543,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	    gnu_type = gnu_subtype;
 	  }
       }
-      break;
+      goto discrete_type;
 
     case E_Signed_Integer_Subtype:
     case E_Enumeration_Subtype:
@@ -1632,6 +1632,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 			   gnat_to_gnu_type
 			   (Original_Array_Type (gnat_entity)));
 
+    discrete_type:
+
       /* We have to handle clauses that under-align the type specially.  */
       if ((Present (Alignment_Clause (gnat_entity))
 	   || (Is_Packed_Array_Type (gnat_entity)
@@ -1685,9 +1687,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 
 	  relate_alias_sets (gnu_type, gnu_field_type, ALIAS_SET_COPY);
 
-	  /* Don't notify the field as "addressable", since we won't be taking
-	     it's address and it would prevent create_field_decl from making a
-	     bitfield.  */
+	  /* Don't declare the field as addressable since we won't be taking
+	     its address and this would prevent create_field_decl from making
+	     a bitfield.  */
 	  gnu_field
 	    = create_field_decl (get_identifier ("OBJECT"), gnu_field_type,
 				 gnu_type, NULL_TREE, bitsize_zero_node, 1, 0);
@@ -1736,9 +1738,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	  TYPE_ALIGN (gnu_type) = align;
 	  relate_alias_sets (gnu_type, gnu_field_type, ALIAS_SET_COPY);
 
-	  /* Don't notify the field as "addressable", since we won't be taking
-	     it's address and it would prevent create_field_decl from making a
-	     bitfield.  */
+	  /* Don't declare the field as addressable since we won't be taking
+	     its address and this would prevent create_field_decl from making
+	     a bitfield.  */
 	  gnu_field
 	    = create_field_decl (get_identifier ("F"), gnu_field_type,
 				 gnu_type, NULL_TREE, bitsize_zero_node, 1, 0);
-- { dg-do run }

with Modular3_Pkg; use Modular3_Pkg;

procedure Modular3 is

  function F1 (A : Int16_T) return Int16_T is
  begin
    return A + 128;
  end;

  function F2 (B : Mod16_T) return Mod16_T is
  begin
    return B + 128;
  end;

  A : Int16_T := 16384;
  B : Mod16_T := 65504;

begin

  A := F1 (A);
  if A /= 16512 then
    raise Program_Error;
  end if;

  B := F2 (B);
  if B /= 96 then
    raise Program_Error;
  end if;

end Modular3;
package Modular3_Pkg is

   type Int16_T is range -32768 .. 32767;
   for Int16_T'Size use 16;
   for Int16_T'Alignment use 1;

   type Mod16_T is mod 2 ** 16;
   for Mod16_T'Size use 16;
   for Mod16_T'Alignment use 1;

end Modular3_Pkg;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]