[Ada] Crash on conversion in branch of if-expression

2019-12-16  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* checks.adb (Apply_Float_Conversion_Check): Use node of type
	conversion and not its parent, when inserting the declaration
	for the temporary that hold the result of the conversion.
	Previously the declaration was inserted above the parent of the
	conversion, apparently as a small optimization for the
	subsequent traversal in Insert_Actions.  Unfortunately a similar
	optimization takes place in Insert_Actions, assuming that the
	insertion point must be above the expression that creates the
	actions to insert.  This is not correct in the presence of
	conditional expressions (i.e.  since Ada2012), where the
	insertion must be in the list of actions attached to the current
	alternative.

From-SVN: r279422
This commit is contained in:
Ed Schonberg 2019-12-16 10:33:54 +00:00 committed by Pierre-Marie de Rodat
parent 4a1872632c
commit 90393d3ca7
2 changed files with 26 additions and 1 deletions

View File

@ -1,3 +1,18 @@
2019-12-16 Ed Schonberg <schonberg@adacore.com>
* checks.adb (Apply_Float_Conversion_Check): Use node of type
conversion and not its parent, when inserting the declaration
for the temporary that hold the result of the conversion.
Previously the declaration was inserted above the parent of the
conversion, apparently as a small optimization for the
subsequent traversal in Insert_Actions. Unfortunately a similar
optimization takes place in Insert_Actions, assuming that the
insertion point must be above the expression that creates the
actions to insert. This is not correct in the presence of
conditional expressions (i.e. since Ada2012), where the
insertion must be in the list of actions attached to the current
alternative.
2019-12-16 Bob Duff <duff@adacore.com>
* sem_attr.adb (Analyze_Attribute): Use Known_RM_Size. But we

View File

@ -2067,7 +2067,17 @@ package body Checks is
Apply_Float_Conversion_Check (Ck_Node, Target_Base);
Set_Etype (Temp, Target_Base);
Insert_Action (Parent (Par),
-- Note : previously the declaration was inserted above
-- the parent of the conversion, apparently as a small
-- optimization for the subequent traversal in Insert_
-- Actions. Unfortunately a similar optimization takes
-- place in Insert_Actions, assuming that the insertion
-- point must be above the expression that creates actions.
-- This is not correct in the presence of conditional
-- expressions, where the insertion must be in the
-- list of asctions attached to the current alternative.
Insert_Action (Par,
Make_Object_Declaration (Loc,
Defining_Identifier => Temp,
Object_Definition => New_Occurrence_Of (Target_Typ, Loc),