Commit 83bb90af by Thomas Quinot Committed by Arnaud Charlet

sem_prag.adb (Analyze_Pragma, [...]): Do not crash on illegal unchecked union…

sem_prag.adb (Analyze_Pragma, [...]): Do not crash on illegal unchecked union that is a null record.

2012-06-12  Thomas Quinot  <quinot@adacore.com>

	* sem_prag.adb (Analyze_Pragma, case Unchecked_Union): Do
	not crash on illegal unchecked union that is a null record.

2012-06-12  Thomas Quinot  <quinot@adacore.com>

	* exp_ch4.adb (Has_Inferable_Discriminants): Reorganize code to
	treat implicit dereferences with a constrained unchecked union
	nominal subtype as having inferable discriminants.

From-SVN: r188437
parent 586ecbf3
2012-06-12 Thomas Quinot <quinot@adacore.com>
* sem_prag.adb (Analyze_Pragma, case Unchecked_Union): Do
not crash on illegal unchecked union that is a null record.
2012-06-12 Thomas Quinot <quinot@adacore.com>
* exp_ch4.adb (Has_Inferable_Discriminants): Reorganize code to
treat implicit dereferences with a constrained unchecked union
nominal subtype as having inferable discriminants.
2012-06-12 Robert Dewar <dewar@adacore.com> 2012-06-12 Robert Dewar <dewar@adacore.com>
* sem_ch6.adb: Minor reformatting. * sem_ch6.adb: Minor reformatting.
......
...@@ -10048,11 +10048,12 @@ package body Exp_Ch4 is ...@@ -10048,11 +10048,12 @@ package body Exp_Ch4 is
-------------------------------- --------------------------------
function Prefix_Is_Formal_Parameter (N : Node_Id) return Boolean is function Prefix_Is_Formal_Parameter (N : Node_Id) return Boolean is
Sel_Comp : Node_Id := N; Sel_Comp : Node_Id;
begin begin
-- Move to the left-most prefix by climbing up the tree -- Move to the left-most prefix by climbing up the tree
Sel_Comp := N;
while Present (Parent (Sel_Comp)) while Present (Parent (Sel_Comp))
and then Nkind (Parent (Sel_Comp)) = N_Selected_Component and then Nkind (Parent (Sel_Comp)) = N_Selected_Component
loop loop
...@@ -10065,20 +10066,12 @@ package body Exp_Ch4 is ...@@ -10065,20 +10066,12 @@ package body Exp_Ch4 is
-- Start of processing for Has_Inferable_Discriminants -- Start of processing for Has_Inferable_Discriminants
begin begin
-- For identifiers and indexed components, it is sufficient to have a
-- constrained Unchecked_Union nominal subtype.
if Nkind_In (N, N_Identifier, N_Indexed_Component) then
return Is_Unchecked_Union (Base_Type (Etype (N)))
and then
Is_Constrained (Etype (N));
-- For selected components, the subtype of the selector must be a -- For selected components, the subtype of the selector must be a
-- constrained Unchecked_Union. If the component is subject to a -- constrained Unchecked_Union. If the component is subject to a
-- per-object constraint, then the enclosing object must have inferable -- per-object constraint, then the enclosing object must have inferable
-- discriminants. -- discriminants.
elsif Nkind (N) = N_Selected_Component then if Nkind (N) = N_Selected_Component then
if Has_Per_Object_Constraint (Entity (Selector_Name (N))) then if Has_Per_Object_Constraint (Entity (Selector_Name (N))) then
-- A small hack. If we have a per-object constrained selected -- A small hack. If we have a per-object constrained selected
...@@ -10087,19 +10080,20 @@ package body Exp_Ch4 is ...@@ -10087,19 +10080,20 @@ package body Exp_Ch4 is
if Prefix_Is_Formal_Parameter (N) then if Prefix_Is_Formal_Parameter (N) then
return True; return True;
end if;
-- Otherwise, check the enclosing object and the selector -- Otherwise, check the enclosing object and the selector
return Has_Inferable_Discriminants (Prefix (N)) else
and then return Has_Inferable_Discriminants (Prefix (N))
Has_Inferable_Discriminants (Selector_Name (N)); and then Has_Inferable_Discriminants (Selector_Name (N));
end if; end if;
-- The call to Has_Inferable_Discriminants will determine whether -- The call to Has_Inferable_Discriminants will determine whether
-- the selector has a constrained Unchecked_Union nominal type. -- the selector has a constrained Unchecked_Union nominal type.
return Has_Inferable_Discriminants (Selector_Name (N)); else
return Has_Inferable_Discriminants (Selector_Name (N));
end if;
-- A qualified expression has inferable discriminants if its subtype -- A qualified expression has inferable discriminants if its subtype
-- mark is a constrained Unchecked_Union subtype. -- mark is a constrained Unchecked_Union subtype.
...@@ -10107,9 +10101,14 @@ package body Exp_Ch4 is ...@@ -10107,9 +10101,14 @@ package body Exp_Ch4 is
elsif Nkind (N) = N_Qualified_Expression then elsif Nkind (N) = N_Qualified_Expression then
return Is_Unchecked_Union (Etype (Subtype_Mark (N))) return Is_Unchecked_Union (Etype (Subtype_Mark (N)))
and then Is_Constrained (Etype (Subtype_Mark (N))); and then Is_Constrained (Etype (Subtype_Mark (N)));
end if;
return False; -- For all other names, it is sufficient to have a constrained
-- Unchecked_Union nominal subtype.
else
return Is_Unchecked_Union (Base_Type (Etype (N)))
and then Is_Constrained (Etype (N));
end if;
end Has_Inferable_Discriminants; end Has_Inferable_Discriminants;
------------------------------- -------------------------------
......
...@@ -14186,18 +14186,23 @@ package body Sem_Prag is ...@@ -14186,18 +14186,23 @@ package body Sem_Prag is
Tdef := Type_Definition (Declaration_Node (Typ)); Tdef := Type_Definition (Declaration_Node (Typ));
Clist := Component_List (Tdef); Clist := Component_List (Tdef);
-- Check presence of component list and variant part
if No (Clist) or else No (Variant_Part (Clist)) then
Error_Msg_N
("Unchecked_Union must have variant part", Tdef);
return;
end if;
-- Check components
Comp := First (Component_Items (Clist)); Comp := First (Component_Items (Clist));
while Present (Comp) loop while Present (Comp) loop
Check_Component (Comp, Typ); Check_Component (Comp, Typ);
Next (Comp); Next (Comp);
end loop; end loop;
if No (Clist) or else No (Variant_Part (Clist)) then -- Check variant part
Error_Msg_N
("Unchecked_Union must have variant part",
Tdef);
return;
end if;
Vpart := Variant_Part (Clist); Vpart := Variant_Part (Clist);
......
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