Commit a66996b3 by Ed Schonberg Committed by Arnaud Charlet

sem_attr.adb: (Resolve_Attribute, case 'address): S (A ..

2008-05-26  Ed Schonberg  <schonberg@adacore.com>

	* sem_attr.adb:
	(Resolve_Attribute, case 'address):  S (A .. B)' address can be safely
	converted to S (A)'address only if A .. B is known to be a non-null
	range.

From-SVN: r135936
parent d693e39d
...@@ -8089,6 +8089,8 @@ package body Sem_Attr is ...@@ -8089,6 +8089,8 @@ package body Sem_Attr is
-- Arr (X .. Y)'address is identical to Arr (X)'address, -- Arr (X .. Y)'address is identical to Arr (X)'address,
-- even if the array is packed and the slice itself is not -- even if the array is packed and the slice itself is not
-- addressable. Transform the prefix into an indexed component. -- addressable. Transform the prefix into an indexed component.
-- Note that the transformation is safe only if we know that
-- the slice is non-null.
declare declare
Loc : constant Source_Ptr := Sloc (P); Loc : constant Source_Ptr := Sloc (P);
...@@ -8096,21 +8098,32 @@ package body Sem_Attr is ...@@ -8096,21 +8098,32 @@ package body Sem_Attr is
Lo : Node_Id; Lo : Node_Id;
begin begin
if Is_Entity_Name (D) then if Is_Entity_Name (D)
and then
Not_Null_Range
(Type_Low_Bound (Entity (D)),
Type_High_Bound (Entity (D)))
then
Lo := Lo :=
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,
Prefix => (New_Occurrence_Of (Entity (D), Loc)), Prefix => (New_Occurrence_Of (Entity (D), Loc)),
Attribute_Name => Name_First); Attribute_Name => Name_First);
else
elsif Not_Null_Range (Low_Bound (D), High_Bound (D)) then
Lo := Low_Bound (D); Lo := Low_Bound (D);
else
Lo := Empty;
end if; end if;
if Present (Lo) then
Rewrite (P, Rewrite (P,
Make_Indexed_Component (Loc, Make_Indexed_Component (Loc,
Prefix => Relocate_Node (Prefix (P)), Prefix => Relocate_Node (Prefix (P)),
Expressions => New_List (Lo))); Expressions => New_List (Lo)));
Analyze_And_Resolve (P); Analyze_And_Resolve (P);
end if;
end; end;
end if; end if;
end Address_Attribute; end Address_Attribute;
......
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