diff mbox series

[Ada] Force evaluation of qualified aggregates

Message ID 20200616130745.GA87021@adacore.com
State New
Headers show
Series [Ada] Force evaluation of qualified aggregates | expand

Commit Message

Pierre-Marie de Rodat June 16, 2020, 1:07 p.m. UTC
This patch fixes regressions in GNATprove, after a previous patch
changed routine Is_Object_Reference to literally implement the Ada RM
and recognize aggregates as objects.

Now routine Evaluate_Name also literally implements the Ada RM rules
about name evaluation; in particular, it restores forced evaluation of
aggregates (which are now recognized as objects).

There appears to be no impact on compilation.

Tested on x86_64-pc-linux-gnu, committed on trunk

2020-06-16  Piotr Trojanek  <trojanek@adacore.com>

gcc/ada/

	* exp_util.adb (Evaluate_Name): Force evaluation of aggregates;
	recursively evaluate expression of a qualified expression; fix
	location of the comment for an attribute referenced and an
	indexed component.
diff mbox series

Patch

--- gcc/ada/exp_util.adb
+++ gcc/ada/exp_util.adb
@@ -4918,11 +4918,16 @@  package body Exp_Util is
 
    procedure Evaluate_Name (Nam : Node_Id) is
    begin
-      --  For an attribute reference or an indexed component, evaluate the
-      --  prefix, which is itself a name, recursively, and then force the
-      --  evaluation of all the subscripts (or attribute expressions).
-
       case Nkind (Nam) is
+         --  For an aggregate, force its evaluation
+
+         when N_Aggregate =>
+            Force_Evaluation (Nam);
+
+         --  For an attribute reference or an indexed component, evaluate the
+         --  prefix, which is itself a name, recursively, and then force the
+         --  evaluation of all the subscripts (or attribute expressions).
+
          when N_Attribute_Reference
             | N_Indexed_Component
          =>
@@ -4960,16 +4965,10 @@  package body Exp_Util is
          =>
             Force_Evaluation (Nam);
 
-         --  For a qualified expression, we evaluate the underlying object
-         --  name if any, otherwise we force the evaluation of the underlying
-         --  expression.
+         --  For a qualified expression, we evaluate the expression
 
          when N_Qualified_Expression =>
-            if Is_Object_Reference (Expression (Nam)) then
-               Evaluate_Name (Expression (Nam));
-            else
-               Force_Evaluation (Expression (Nam));
-            end if;
+            Evaluate_Name (Expression (Nam));
 
          --  For a selected component, we simply evaluate the prefix