exp_ch9.adb (Is_Pure_Barrier): Create function Is_Count_Attribute to identify an...
authorJustin Squirek <squirek@adacore.com>
Thu, 19 Jan 2017 13:10:58 +0000 (13:10 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 19 Jan 2017 13:10:58 +0000 (14:10 +0100)
2017-01-19  Justin Squirek  <squirek@adacore.com>

* exp_ch9.adb (Is_Pure_Barrier): Create function
Is_Count_Attribute to identify an expansion of the 'Count
attribute.

From-SVN: r244631

gcc/ada/ChangeLog
gcc/ada/exp_ch9.adb

index 8287640adb57eec48462cba1d401edcbb6c03800..0b0888a9e7a619d0cdeadbc0281bd10b27c1eb95 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-19  Justin Squirek  <squirek@adacore.com>
+
+       * exp_ch9.adb (Is_Pure_Barrier): Create function
+       Is_Count_Attribute to identify an expansion of the 'Count
+       attribute.
+
 2017-01-19  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * exp_dbug.adb (Debug_Renaming_Declaration): Process underlying types.
index 4a98f191d86ef9c0df8e8051cd518b9d229efc92..9ea30eebe5700c805fb3ad148e06de8090e17862 100644 (file)
@@ -6025,6 +6025,25 @@ package body Exp_Ch9 is
       ---------------------
 
       function Is_Pure_Barrier (N : Node_Id) return Traverse_Result is
+         function Is_Count_Attribute (N : Node_Id) return Boolean;
+         --  Check whether N is part of an expansion of the Count attribute.
+         --  Return True if N represents the expanded function call.
+
+         ------------------------
+         -- Is_Count_Attribute --
+         ------------------------
+
+         function Is_Count_Attribute (N : Node_Id) return Boolean is
+         begin
+            return
+              Nkind (N) = N_Function_Call
+                and then Present (Original_Node (N))
+                and then Nkind (Original_Node (N)) = N_Attribute_Reference
+                and then Attribute_Name (Original_Node (N)) = Name_Count;
+         end Is_Count_Attribute;
+
+      --  Start of processing for Is_Pure_Barrier
+
       begin
          case Nkind (N) is
             when N_Expanded_Name
@@ -6034,6 +6053,12 @@ package body Exp_Ch9 is
                   return Abandon;
                end if;
 
+               if Present (Parent (N))
+                 and then Is_Count_Attribute (Parent (N))
+               then
+                  return OK;
+               end if;
+
                case Ekind (Entity (N)) is
                   when E_Constant
                      | E_Discriminant
@@ -6057,6 +6082,11 @@ package body Exp_Ch9 is
                      null;
                end case;
 
+            when N_Function_Call =>
+               if Is_Count_Attribute (N) then
+                  return OK;
+               end if;
+
             when N_Character_Literal
                | N_Integer_Literal
                | N_Real_Literal