Patchwork [Ada] Lift unexpected alignment restriction on modular types

login
register
mail settings
Submitter Eric Botcazou
Date July 3, 2010, 9:49 a.m.
Message ID <201007031149.57683.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/57796/
State New
Headers show

Comments

Eric Botcazou - July 3, 2010, 9:49 a.m.
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.

Patch

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