OSDN Git Service

* gcc-interface/trans.c (unchecked_conversion_nop): Handle function
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Apr 2010 12:23:39 +0000 (12:23 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Apr 2010 12:23:39 +0000 (12:23 +0000)
calls.  Return true for conversion from a record subtype to its type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158412 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/discr_private.ads [new file with mode: 0644]

index 4e6367c..1fef2c7 100644 (file)
@@ -1,5 +1,10 @@
 2010-04-16  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * gcc-interface/trans.c (unchecked_conversion_nop): Handle function
+       calls.  Return true for conversion from a record subtype to its type.
+
+2010-04-16  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gcc-interface/decl.c (gnat_to_gnu_entity): Use boolean_type_node in
        lieu of integer_type_node for boolean operations.
        (choices_to_gnu): Likewise.
index b446e07..e2a480d 100644 (file)
@@ -3670,7 +3670,8 @@ unchecked_conversion_nop (Node_Id gnat_node)
      could de facto ensure type consistency and this should be preserved.  */
   if (!(Nkind (Parent (gnat_node)) == N_Assignment_Statement
        && Name (Parent (gnat_node)) == gnat_node)
-      && !(Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
+      && !((Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
+           || Nkind (Parent (gnat_node)) == N_Function_Call)
           && Name (Parent (gnat_node)) != gnat_node))
     return false;
 
@@ -3688,11 +3689,16 @@ unchecked_conversion_nop (Node_Id gnat_node)
   if (to_type == from_type)
     return true;
 
-  /* For an array type, the conversion to the PAT is a no-op.  */
+  /* For an array subtype, the conversion to the PAT is a no-op.  */
   if (Ekind (from_type) == E_Array_Subtype
       && to_type == Packed_Array_Type (from_type))
     return true;
 
+  /* For a record subtype, the conversion to the type is a no-op.  */
+  if (Ekind (from_type) == E_Record_Subtype
+      && to_type == Etype (from_type))
+    return true;
+
   return false;
 }
 
index 450aa4f..589e80f 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-16  Olivier Hainque  <hainque@adacore.com>
+
+       * gnat.dg/specs/discr_private.ads: New test.
+
 2010-04-16  Bernd Schmidt  <bernds@codesourcery.com>
 
        PR target/41514
diff --git a/gcc/testsuite/gnat.dg/specs/discr_private.ads b/gcc/testsuite/gnat.dg/specs/discr_private.ads
new file mode 100644 (file)
index 0000000..0ddfbd1
--- /dev/null
@@ -0,0 +1,50 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+package Discr_Private is
+
+   package Dec is
+      type T_DECIMAL (Prec : Integer := 1) is private;
+   private
+      type T_DECIMAL (Prec : Integer := 1) is record
+         case Prec is
+            when  1 .. 2 => Value : Integer;
+            when others => null;
+         end case;
+      end record;
+   end;
+
+   type Value_T is record
+      Bits  : Dec.T_DECIMAL(1);
+   end record;
+   for Value_T'size use 88;
+
+   type Value_Entry_T is record
+      Index : Integer;
+      Value : Value_T;
+   end record;
+
+   type Value_Mode is (QI, HI, SI, DI, XI);
+   for Value_Mode'size use 8;
+
+   type Valid_Modes_T is array (Value_Mode) of Boolean;
+
+   type Register_T is record
+      Ventry : Value_Entry_T;
+      Vmodes : Valid_Modes_T;
+   end record;
+
+   type Regid_T is (Latch, Acc);
+   for Regid_T use (Latch => 0, Acc => 2);
+   for Regid_T'Size use 8;
+
+   type Regarray_T is array (Regid_T) of Register_T;
+
+   type Machine_T (Up : Boolean := True) is record
+      case Up is
+         when True  => Regs : Regarray_T;
+         when False => null;
+       end case;
+   end record;
+
+end Discr_Private;