aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2010-04-16 12:23:39 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-04-16 12:23:39 +0000
commit68a3eb69b12f7385ed0696ecf696a4ee47f61619 (patch)
tree7b49675ef041277b8a277a1353c08016c4479bc3
parent1139f2e89d9e5199b66b05caba688be566561f1f (diff)
downloadgcc-68a3eb69b12f7385ed0696ecf696a4ee47f61619.zip
gcc-68a3eb69b12f7385ed0696ecf696a4ee47f61619.tar.gz
gcc-68a3eb69b12f7385ed0696ecf696a4ee47f61619.tar.bz2
trans.c (unchecked_conversion_nop): Handle function calls.
* gcc-interface/trans.c (unchecked_conversion_nop): Handle function calls. Return true for conversion from a record subtype to its type. From-SVN: r158412
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/trans.c10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/specs/discr_private.ads50
4 files changed, 67 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 4e6367c..1fef2c7 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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.
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index b446e07..e2a480d 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 450aa4f..589e80f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0ddfbd1
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/discr_private.ads
@@ -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;