[Ada] Max_Entry_Queue_Length aspect for protected entries
authorJustin Squirek <squirek@adacore.com>
Wed, 21 Aug 2019 08:29:23 +0000 (08:29 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 21 Aug 2019 08:29:23 +0000 (08:29 +0000)
Allow values of negative one to be accepted as a valid parameter as a
special case.

2019-08-21  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst: Modify
documentation to reflect expected behavior.
* gnat_rm.texi: Regenerate.
* sem_prag.adb (Analyze_Pragma): Modify handling of pragma
Max_Entry_Queue_Length to not reject integer values of negative
one.
* sem_util.adb (Get_Max_Queue_Length): Add processing for values
of negative one to fit within the current scheme.

From-SVN: r274774

gcc/ada/ChangeLog
gcc/ada/doc/gnat_rm/implementation_defined_pragmas.rst
gcc/ada/gnat_rm.texi
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb

index 6273a551223ad80e37a5ff877d30373f876f75b7..db943199570637fa7cc0c4a3228de1a52fe881e6 100644 (file)
@@ -1,3 +1,14 @@
+2019-08-21  Justin Squirek  <squirek@adacore.com>
+
+       * doc/gnat_rm/implementation_defined_pragmas.rst: Modify
+       documentation to reflect expected behavior.
+       * gnat_rm.texi: Regenerate.
+       * sem_prag.adb (Analyze_Pragma): Modify handling of pragma
+       Max_Entry_Queue_Length to not reject integer values of negative
+       one.
+       * sem_util.adb (Get_Max_Queue_Length): Add processing for values
+       of negative one to fit within the current scheme.
+
 2019-08-20  Arnaud Charlet  <charlet@adacore.com>
 
        * exp_unst.adb (Unnest_Subprograms, Unnest_Subprogram): Take
index 91c2d33568874027ccef3ac963e05392c9a10456..625a38ff77d5639de021bc436c69d731e0530bc0 100644 (file)
@@ -3888,8 +3888,10 @@ Syntax::
 
 This pragma is used to specify the maximum callers per entry queue for
 individual protected entries and entry families. It accepts a single
-positive integer as a parameter and must appear after the declaration
-of an entry.
+integer (-1 or more) as a parameter and must appear after the declaration of an
+entry.
+
+A value of -1 represents no additional restriction on queue length.
 
 Pragma No_Body
 ==============
index dbd299cdd5185faca423cf726a1e20be8f66556d..d5aa3965601206f76d295712b0e64adbea622222 100644 (file)
@@ -1764,9 +1764,9 @@ Syntax:
 pragma Aggregate_Individually_Assign;
 @end example
 
-Where possible GNAT will store the binary representation of a record aggregate
+Where possible, GNAT will store the binary representation of a record aggregate
 in memory for space and performance reasons. This configuration pragma changes
-this behaviour so that record aggregates are instead always converted into
+this behavior so that record aggregates are instead always converted into
 individual assignment statements.
 
 @node Pragma Allow_Integer_Address,Pragma Annotate,Pragma Aggregate_Individually_Assign,Implementation Defined Pragmas
@@ -5394,8 +5394,10 @@ pragma Max_Entry_Queue (static_integer_EXPRESSION);
 
 This pragma is used to specify the maximum callers per entry queue for
 individual protected entries and entry families. It accepts a single
-positive integer as a parameter and must appear after the declaration
-of an entry.
+integer (-1 or more) as a parameter and must appear after the declaration of an
+entry.
+
+A value of -1 represents no additional restriction on queue length.
 
 @node Pragma No_Body,Pragma No_Caching,Pragma Max_Queue_Length,Implementation Defined Pragmas
 @anchor{gnat_rm/implementation_defined_pragmas pragma-no-body}@anchor{a1}
index 4a774515e7bd10aa7d16bc1858cf8f4757254b2e..4ec8611fccfff8ff79f7626bf30551ec8d4bc89c 100644 (file)
@@ -19538,7 +19538,7 @@ package body Sem_Prag is
             | Pragma_Max_Entry_Queue_Depth
             | Pragma_Max_Queue_Length
          =>
-         Max_Queue_Length : declare
+         Max_Entry_Queue_Length : declare
             Arg        : Node_Id;
             Entry_Decl : Node_Id;
             Entry_Id   : Entity_Id;
@@ -19589,9 +19589,9 @@ package body Sem_Prag is
 
             Val := Expr_Value (Arg);
 
-            if Val <= 0 then
+            if Val < -1 then
                Error_Pragma_Arg
-                 ("argument for pragma% must be positive", Arg1);
+                 ("argument for pragma% cannot be less than -1", Arg1);
 
             elsif not UI_Is_In_Int_Range (Val) then
                Error_Pragma_Arg
@@ -19609,7 +19609,7 @@ package body Sem_Prag is
             end if;
 
             Record_Rep_Item (Entry_Id, N);
-         end Max_Queue_Length;
+         end Max_Entry_Queue_Length;
 
          -----------------
          -- Memory_Size --
index dcc8d64485c71ea056e4ff4ca305f9585057671f..f837b6fd91214e4f6ca5721797ae99bcd1636455 100644 (file)
@@ -9752,16 +9752,27 @@ package body Sem_Util is
    function Get_Max_Queue_Length (Id : Entity_Id) return Uint is
       pragma Assert (Is_Entry (Id));
       Prag : constant Entity_Id := Get_Pragma (Id, Pragma_Max_Queue_Length);
+      Max  : Uint;
 
    begin
-      --  A value of 0 represents no maximum specified, and entries and entry
-      --  families with no Max_Queue_Length aspect or pragma default to it.
+      --  A value of 0 or -1 represents no maximum specified, and entries and
+      --  entry families with no Max_Queue_Length aspect or pragma default to
+      --  it.
 
       if not Present (Prag) then
          return Uint_0;
       end if;
 
-      return Intval (Expression (First (Pragma_Argument_Associations (Prag))));
+      Max := Intval (Expression (First (Pragma_Argument_Associations (Prag))));
+
+      --  Since -1 and 0 are equivalent, return 0 for instances of -1 for
+      --  uniformity.
+
+      if Max = -1 then
+         return Uint_0;
+      end if;
+
+      return Max;
    end Get_Max_Queue_Length;
 
    ------------------------