[Ada] Crash on conversion in branch of if-expression
authorEd Schonberg <schonberg@adacore.com>
Mon, 16 Dec 2019 10:33:54 +0000 (10:33 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 16 Dec 2019 10:33:54 +0000 (10:33 +0000)
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

gcc/ada/ChangeLog
gcc/ada/checks.adb

index aa9704309904c59c5715ede3f9f4a6f8580659e7..e0f821b0a285eaba0bef284b8a8a9858ca3789d0 100644 (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
index 9ca1cf0cdce0a993753845a31e3e74c4641e36e0..6b910fd7024b08fd84e424bea33d3798a29632c7 100644 (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),