trans.c (lhs_or_actual_p): New predicate.

* gcc-interface/trans.c (lhs_or_actual_p): New predicate.
	(unchecked_conversion_nop): Use it.
	(gnat_to_gnu): Likewise.

From-SVN: r180243
This commit is contained in:
Eric Botcazou 2011-10-20 11:03:54 +00:00 committed by Eric Botcazou
parent b756276959
commit 27ab5bd888
2 changed files with 37 additions and 17 deletions

View File

@ -1,3 +1,9 @@
2011-10-20 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (lhs_or_actual_p): New predicate.
(unchecked_conversion_nop): Use it.
(gnat_to_gnu): Likewise.
2011-10-20 Eric Botcazou <ebotcazou@adacore.com>
* back_end.adb (Call_Back_End): Pass the maximum logical line number

View File

@ -4472,6 +4472,28 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
invalidate_global_renaming_pointers ();
}
/* Return true if GNAT_NODE is on the LHS of an assignment or an actual
parameter of a call. */
static bool
lhs_or_actual_p (Node_Id gnat_node)
{
Node_Id gnat_parent = Parent (gnat_node);
Node_Kind kind = Nkind (gnat_parent);
if (kind == N_Assignment_Statement && Name (gnat_parent) == gnat_node)
return true;
if ((kind == N_Procedure_Call_Statement || kind == N_Function_Call)
&& Name (gnat_parent) != gnat_node)
return true;
if (kind == N_Parameter_Association)
return true;
return false;
}
/* 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. */
@ -4483,11 +4505,7 @@ unchecked_conversion_nop (Node_Id gnat_node)
/* 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)
&& !((Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
|| Nkind (Parent (gnat_node)) == N_Function_Call)
&& Name (Parent (gnat_node)) != gnat_node))
if (!lhs_or_actual_p (gnat_node))
return false;
from_type = Etype (Expression (gnat_node));
@ -6528,13 +6546,13 @@ gnat_to_gnu (Node_Id gnat_node)
/* Now convert the result to the result type, unless we are in one of the
following cases:
1. If this is the Name of an assignment statement or a parameter of
a procedure call, return the result almost unmodified since the
RHS will have to be converted to our type in that case, unless
the result type has a simpler size. Likewise if there is just
a no-op unchecked conversion in-between. Similarly, don't convert
integral types that are the operands of an unchecked conversion
since we need to ignore those conversions (for 'Valid).
1. If this is the LHS of an assignment or an actual parameter of a
call, return the result almost unmodified since the RHS will have
to be converted to our type in that case, unless the result type
has a simpler size. Likewise if there is just a no-op unchecked
conversion in-between. Similarly, don't convert integral types
that are the operands of an unchecked conversion since we need
to ignore those conversions (for 'Valid).
2. If we have a label (which doesn't have any well-defined type), a
field or an error, return the result almost unmodified. Similarly,
@ -6549,13 +6567,9 @@ gnat_to_gnu (Node_Id gnat_node)
4. Finally, if the type of the result is already correct. */
if (Present (Parent (gnat_node))
&& ((Nkind (Parent (gnat_node)) == N_Assignment_Statement
&& Name (Parent (gnat_node)) == gnat_node)
&& (lhs_or_actual_p (gnat_node)
|| (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
&& 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
|| (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
&& !AGGREGATE_TYPE_P (gnu_result_type)
&& !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))