exp_util.adb (Possible_Bit_Aligned_Component): Do not process an unanalyzed node.
authorHristian Kirtchev <kirtchev@adacore.com>
Mon, 2 Mar 2015 10:52:59 +0000 (10:52 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 2 Mar 2015 10:52:59 +0000 (11:52 +0100)
2015-03-02  Hristian Kirtchev  <kirtchev@adacore.com>

* exp_util.adb (Possible_Bit_Aligned_Component): Do not process
an unanalyzed node.
* sem_util.adb (Kill_Current_Values): Do not invalidate and
de-null a constant.

From-SVN: r221107

gcc/ada/ChangeLog
gcc/ada/exp_util.adb
gcc/ada/sem_util.adb

index ca3de2d8f43256ceaebade800c22a5276be33f56..6220a7ed89ba016aa60d73eec0463368754756ee 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-02  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_util.adb (Possible_Bit_Aligned_Component): Do not process
+       an unanalyzed node.
+       * sem_util.adb (Kill_Current_Values): Do not invalidate and
+       de-null a constant.
+
 2015-03-02  Robert Dewar  <dewar@adacore.com>
 
        * sem_ch3.adb, exp_attr.adb, checks.adb, exp_aggr.adb: Minor
index aa835adf6320153d96a49e7c90eeffea13faa31f..a565e7f023be57cf867aa3d900320651b3311413 100644 (file)
@@ -6938,6 +6938,13 @@ package body Exp_Util is
 
    function Possible_Bit_Aligned_Component (N : Node_Id) return Boolean is
    begin
+      --  Do not process an unanalyzed node because it is not yet decorated and
+      --  most checks performed below will fail.
+
+      if not Analyzed (N) then
+         return False;
+      end if;
+
       case Nkind (N) is
 
          --  Case of indexed component
index d9ab705bd13e10946934ee565e45e2ff7d8bea64..2ea04d700b93d5ea9e4e32a542bcbf99920fc87b 100644 (file)
@@ -13012,20 +13012,33 @@ package body Sem_Util is
             Kill_Checks (Ent);
             Set_Current_Value (Ent, Empty);
 
-            if not Can_Never_Be_Null (Ent) then
-               Set_Is_Known_Non_Null (Ent, False);
-            end if;
+            --  Do not reset the Is_Known_[Non_]Null and Is_Known_Valid flags
+            --  for a constant. Once the constant is elaborated, its value is
+            --  not changed, therefore the associated flags that describe the
+            --  value should not be modified either.
 
-            Set_Is_Known_Null (Ent, False);
+            if Ekind (Ent) = E_Constant then
+               null;
 
-            --  Reset Is_Known_Valid unless type is always valid, or if we have
-            --  a loop parameter (loop parameters are always valid, since their
-            --  bounds are defined by the bounds given in the loop header).
+            --  Non-constant entities
 
-            if not Is_Known_Valid (Etype (Ent))
-              and then Ekind (Ent) /= E_Loop_Parameter
-            then
-               Set_Is_Known_Valid (Ent, False);
+            else
+               if not Can_Never_Be_Null (Ent) then
+                  Set_Is_Known_Non_Null (Ent, False);
+               end if;
+
+               Set_Is_Known_Null (Ent, False);
+
+               --  Reset the Is_Known_Valid flag unless the type is always
+               --  valid. This does not apply to a loop parameter because its
+               --  bounds are defined by the loop header and therefore always
+               --  valid.
+
+               if not Is_Known_Valid (Etype (Ent))
+                 and then Ekind (Ent) /= E_Loop_Parameter
+               then
+                  Set_Is_Known_Valid (Ent, False);
+               end if;
             end if;
          end if;
       end if;