Compiler crashes on a function call when function profile includes
an in_out parameter, the parameter type has an inherited type
invariant, and the actual is a view conversion to an ancestor type.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_ch6.adb (Add_View_Conversion_Invariants): Do not insert
generated invariant checks when the call is a function call.
These tests are properly inserted in the code in procedure
Insert_Post_Call_Actions, which takes care of finding the proper
insertion point for the checks.
(Insert_Post_Call_Actions): Add question marks to indicate
possible gap in handling function calls that appear as aggregate
components.
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -2943,7 +2943,12 @@ package body Exp_Ch6 is
Par_Typ := Base_Type (Etype (Curr_Typ));
end loop;
- if not Is_Empty_List (Inv_Checks) then
+ -- If the node is a function call the generated tests have been
+ -- already handled in Insert_Post_Call_Actions.
+
+ if not Is_Empty_List (Inv_Checks)
+ and then Nkind (Call_Node) = N_Procedure_Call_Statement
+ then
Insert_Actions_After (Call_Node, Inv_Checks);
end if;
end Add_View_Conversion_Invariants;
@@ -8388,6 +8393,7 @@ package body Exp_Ch6 is
-- The only exception is when the function call acts as an actual in a
-- procedure call. In this case the function call is in a list, but the
-- post-call actions must be inserted after the procedure call.
+ -- What if the function call is an aggregate component ???
elsif Nkind (Context) = N_Procedure_Call_Statement then
Insert_Actions_After (Context, Post_Call);