From 4f8a6678fb815e575d6ffacebe9cbedc3141c974 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 25 Nov 2009 21:57:02 +0000 Subject: [PATCH] trans.c (unchecked_conversion_lhs_nop): Rename into... * gcc-interface/trans.c (unchecked_conversion_lhs_nop): Rename into... (unchecked_conversion_nop): ...this. Handle actual parameters. (gnat_to_gnu): Adjust for above renaming. From-SVN: r154659 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/gcc-interface/trans.c | 20 ++++++++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gnat.dg/specs/pack6.ads | 24 +++++++++++++++++++++++ gcc/testsuite/gnat.dg/specs/pack6_pkg.ads | 17 ++++++++++++++++ 5 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/pack6.ads create mode 100644 gcc/testsuite/gnat.dg/specs/pack6_pkg.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2098cfd326b..001d5a8b6aa 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2009-11-25 Eric Botcazou + + * gcc-interface/trans.c (unchecked_conversion_lhs_nop): Rename into... + (unchecked_conversion_nop): ...this. Handle actual parameters. + (gnat_to_gnu): Adjust for above renaming. + 2009-11-25 Eric Botcazou * gcc-interface/decl.c (gnat_to_gnu_entity) : diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index afdc20afd6d..5e568a2447c 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -3432,19 +3432,21 @@ Compilation_Unit_to_gnu (Node_Id gnat_node) invalidate_global_renaming_pointers (); } -/* Return whether GNAT_NODE, an unchecked type conversion, is on the LHS - of an assignment and a no-op as far as gigi is concerned. */ +/* Return true if GNAT_NODE, an unchecked type conversion, is a no-op as far + as gigi is concerned. This is used to avoid conversions on the LHS. */ static bool -unchecked_conversion_lhs_nop (Node_Id gnat_node) +unchecked_conversion_nop (Node_Id gnat_node) { Entity_Id from_type, to_type; - /* The conversion must be on the LHS of an assignment. Otherwise, even - if the conversion was essentially a no-op, it could de facto ensure - type consistency and this should be preserved. */ + /* The conversion must be on the LHS of an assignment or an actual parameter + of a call. Otherwise, even if the conversion was essentially a no-op, it + 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)) + && Name (Parent (gnat_node)) == gnat_node) + && !(Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement + && Name (Parent (gnat_node)) != gnat_node)) return false; from_type = Etype (Expression (gnat_node)); @@ -4156,7 +4158,7 @@ gnat_to_gnu (Node_Id gnat_node) gnu_result = gnat_to_gnu (Expression (gnat_node)); /* Skip further processing if the conversion is deemed a no-op. */ - if (unchecked_conversion_lhs_nop (gnat_node)) + if (unchecked_conversion_nop (gnat_node)) { gnu_result_type = TREE_TYPE (gnu_result); break; @@ -5409,7 +5411,7 @@ gnat_to_gnu (Node_Id gnat_node) && ((Nkind (Parent (gnat_node)) == N_Assignment_Statement && Name (Parent (gnat_node)) == gnat_node) || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion - && unchecked_conversion_lhs_nop (Parent (gnat_node))) + && unchecked_conversion_nop (Parent (gnat_node))) || (Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement && Name (Parent (gnat_node)) != gnat_node) || Nkind (Parent (gnat_node)) == N_Parameter_Association diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index acc9be109ad..9eff27dcdcb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-25 Eric Botcazou + + * gnat.dg/specs/pack6.ads: New test. + * gnat.dg/specs/pack6_pkg.ads: New helper. + 2009-11-25 Jakub Jelinek * gcc.target/powerpc/regnames-1.c: New test. diff --git a/gcc/testsuite/gnat.dg/specs/pack6.ads b/gcc/testsuite/gnat.dg/specs/pack6.ads new file mode 100644 index 00000000000..cf1813d144b --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/pack6.ads @@ -0,0 +1,24 @@ +-- { dg-do compile } + +with Ada.Finalization; +with Pack6_Pkg; + +package Pack6 is + + package Eight_Bits is new Pack6_Pkg (8); + + type Some_Data is record + Byte_1 : Eight_Bits.Object; + Byte_2 : Eight_Bits.Object; + end record; + + for Some_Data use record + Byte_1 at 0 range 0 .. 7; + Byte_2 at 1 range 0 .. 7; + end record; + + type Top_Object is new Ada.Finalization.Controlled with record + Data : Some_Data; + end record; + +end Pack6; diff --git a/gcc/testsuite/gnat.dg/specs/pack6_pkg.ads b/gcc/testsuite/gnat.dg/specs/pack6_pkg.ads new file mode 100644 index 00000000000..52ded342d4b --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/pack6_pkg.ads @@ -0,0 +1,17 @@ +generic + + Size : Positive; + +package Pack6_Pkg is + + type Object is private; + +private + + type Bit is range 0 .. 1; + for Bit'Size use 1; + + type Object is array (1 .. Size) of Bit; + pragma Pack (Object); + +end Pack6_Pkg;