Commit d85badc7 by Bob Duff Committed by Arnaud Charlet

exp_attr.adb (Attribute_Max_Size_In_Storage_Elements): Eliminate 'Class…

exp_attr.adb (Attribute_Max_Size_In_Storage_Elements): Eliminate 'Class references from the tree, because gigi crashes on 'Class.

2014-11-20  Bob Duff  <duff@adacore.com>

	* exp_attr.adb (Attribute_Max_Size_In_Storage_Elements):
	Eliminate 'Class references from the tree, because gigi crashes on
	'Class. Also, don't check Nkind (Attr) -- it is known to be
	N_Attribute_Reference.	Assert that instead.

From-SVN: r217856
parent d8d7e809
2014-11-20 Bob Duff <duff@adacore.com> 2014-11-20 Bob Duff <duff@adacore.com>
* exp_attr.adb (Attribute_Max_Size_In_Storage_Elements):
Eliminate 'Class references from the tree, because gigi crashes on
'Class. Also, don't check Nkind (Attr) -- it is known to be
N_Attribute_Reference. Assert that instead.
2014-11-20 Bob Duff <duff@adacore.com>
* debug.adb: Minor comment fix. * debug.adb: Minor comment fix.
2014-11-20 Arnaud Charlet <charlet@adacore.com> 2014-11-20 Arnaud Charlet <charlet@adacore.com>
......
...@@ -4215,6 +4215,17 @@ package body Exp_Attr is ...@@ -4215,6 +4215,17 @@ package body Exp_Attr is
-- wrapped inside a type conversion. -- wrapped inside a type conversion.
begin begin
-- If the prefix is X'Class, we transform it into a direct reference
-- to the class-wide type, because the back end must not see a 'Class
-- reference. See also 'Size.
if Is_Entity_Name (Pref)
and then Is_Class_Wide_Type (Entity (Pref))
then
Rewrite (Prefix (N), New_Occurrence_Of (Entity (Pref), Loc));
return;
end if;
Apply_Universal_Integer_Attribute_Checks (N); Apply_Universal_Integer_Attribute_Checks (N);
-- The universal integer check may sometimes add a type conversion, -- The universal integer check may sometimes add a type conversion,
...@@ -4225,6 +4236,7 @@ package body Exp_Attr is ...@@ -4225,6 +4236,7 @@ package body Exp_Attr is
Attr := Expression (Attr); Attr := Expression (Attr);
Conversion_Added := True; Conversion_Added := True;
end if; end if;
pragma Assert (Nkind (Attr) = N_Attribute_Reference);
-- Heap-allocated controlled objects contain two extra pointers which -- Heap-allocated controlled objects contain two extra pointers which
-- are not part of the actual type. Transform the attribute reference -- are not part of the actual type. Transform the attribute reference
...@@ -4234,7 +4246,6 @@ package body Exp_Attr is ...@@ -4234,7 +4246,6 @@ package body Exp_Attr is
-- two pointers are already present in the type. -- two pointers are already present in the type.
if VM_Target = No_VM if VM_Target = No_VM
and then Nkind (Attr) = N_Attribute_Reference
and then Needs_Finalization (Ptyp) and then Needs_Finalization (Ptyp)
and then not Header_Size_Added (Attr) and then not Header_Size_Added (Attr)
then then
...@@ -5567,9 +5578,9 @@ package body Exp_Attr is ...@@ -5567,9 +5578,9 @@ package body Exp_Attr is
end if; end if;
end if; end if;
-- For class-wide types, X'Class'Size is transformed into a direct -- If the prefix is X'Class, we transform it into a direct reference
-- reference to the Size of the class type, so that the back end does -- to the class-wide type, because the back end must not see a 'Class
-- not have to deal with the X'Class'Size reference. -- reference.
if Is_Entity_Name (Pref) if Is_Entity_Name (Pref)
and then Is_Class_Wide_Type (Entity (Pref)) and then Is_Class_Wide_Type (Entity (Pref))
......
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