Commit 79646678 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): Simplify the condition under which a constant…

decl.c (gnat_to_gnu_entity): Simplify the condition under which a constant renaming is treated as a normal...

	* decl.c (gnat_to_gnu_entity) <Object>: Simplify the condition under
	which a constant renaming is treated as a normal object declaration.
	* trans.c (lvalue_required_p) <N_Slice>: New case, extracted from
	the N_Indexed_Component case.
	<N_Indexed_Component>: Fall through to above case.
	<N_Object_Renaming_Declaration>: Return true for all composite types.

From-SVN: r128268
parent 3b9f15d2
2007-09-08 Eric Botcazou <ebotcazou@adacore.com> 2007-09-08 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (gnat_to_gnu_entity) <Object>: Simplify the condition under
which a constant renaming is treated as a normal object declaration.
* trans.c (lvalue_required_p) <N_Slice>: New case, extracted from
the N_Indexed_Component case.
<N_Indexed_Component>: Fall through to above case.
<N_Object_Renaming_Declaration>: Return true for all composite types.
2007-09-08 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (make_packable_type): If the new type has been given BLKmode, * decl.c (make_packable_type): If the new type has been given BLKmode,
try again to get an integral mode for it. try again to get an integral mode for it.
...@@ -815,10 +815,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -815,10 +815,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
/* Case 3: If this is a constant renaming and creating a /* Case 3: If this is a constant renaming and creating a
new object is allowed and cheap, treat it as a normal new object is allowed and cheap, treat it as a normal
object whose initial value is what is being renamed. */ object whose initial value is what is being renamed. */
if (const_flag if (const_flag && Is_Elementary_Type (Etype (gnat_entity)))
&& Ekind (Etype (gnat_entity)) != E_Class_Wide_Type
&& TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
&& TYPE_MODE (gnu_type) != BLKmode)
; ;
/* Case 4: Make this into a constant pointer to the object we /* Case 4: Make this into a constant pointer to the object we
......
...@@ -384,20 +384,28 @@ lvalue_required_p (Node_Id gnat_node, tree operand_type, int aliased) ...@@ -384,20 +384,28 @@ lvalue_required_p (Node_Id gnat_node, tree operand_type, int aliased)
gnat_temp = Next (gnat_temp)) gnat_temp = Next (gnat_temp))
if (Nkind (gnat_temp) != N_Integer_Literal) if (Nkind (gnat_temp) != N_Integer_Literal)
return 1; return 1;
aliased |= Has_Aliased_Components (Etype (Prefix (gnat_node)));
return lvalue_required_p (Parent (gnat_node), operand_type, aliased);
} }
/* ... fall through ... */
case N_Slice:
aliased |= Has_Aliased_Components (Etype (Prefix (gnat_node)));
return lvalue_required_p (Parent (gnat_node), operand_type, aliased);
case N_Selected_Component: case N_Selected_Component:
aliased |= Is_Aliased (Entity (Selector_Name (gnat_node))); aliased |= Is_Aliased (Entity (Selector_Name (gnat_node)));
return lvalue_required_p (Parent (gnat_node), operand_type, aliased); return lvalue_required_p (Parent (gnat_node), operand_type, aliased);
case N_Object_Renaming_Declaration: case N_Object_Renaming_Declaration:
/* We need to make a real renaming only if the constant object is /* We need to make a real renaming only if the constant object is
aliased; otherwise we can optimize and return the rvalue. We aliased or if we may use a renaming pointer; otherwise we can
make an exception if the object is an identifier since in this optimize and return the rvalue. We make an exception if the object
case the rvalue can be propagated attached to the CONST_DECL. */ is an identifier since in this case the rvalue can be propagated
return aliased || Nkind (Name (gnat_node)) == N_Identifier; attached to the CONST_DECL. */
return (aliased != 0
/* This should match the constant case of the renaming code. */
|| Is_Composite_Type (Etype (Name (gnat_node)))
|| Nkind (Name (gnat_node)) == N_Identifier);
default: default:
return 0; return 0;
......
2007-09-08 Eric Botcazou <ebotcazou@adacore.com> 2007-09-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/renaming3.adb, renaming4.ads: New test.
2007-09-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/unaligned_rep_clause.adb: New testcase. * gnat.dg/unaligned_rep_clause.adb: New testcase.
2007-09-08 Dorit Nuzman <dorit@il.ibm.com> 2007-09-08 Dorit Nuzman <dorit@il.ibm.com>
-- { dg-do run }
with Renaming4; use Renaming4;
procedure Renaming3 is
type A is array(1..16) of Integer;
Filler : A := (others => 0);
begin
if B(1) /= 1 then
raise Program_Error;
end if;
end;
package Renaming4 is
type Big_Array is array (Natural range <>) of Integer;
subtype Index is Natural range 1..4;
subtype My_Array is Big_Array(Index);
A : constant My_Array := (1, 2, 3, 4);
subtype Small is Index range 1..2;
subtype Small_Array is Big_Array(Small);
B : Small_Array renames A(Index);
end Renaming4;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment