CVS difference for ai12s/ai12-0312-1.txt

Differences between 1.13 and version 1.14
Log of other versions for file ai12s/ai12-0312-1.txt

--- ai12s/ai12-0312-1.txt	2019/10/30 05:03:12	1.13
+++ ai12s/ai12-0312-1.txt	2019/11/13 04:40:28	1.14
@@ -1,4 +1,23 @@
-!standard 5.5.2(2/3)                                  19-10-29  AI12-0312-1/08
+!standard 3.9.4(32/2)                                  19-11-11  AI12-0312-1/09
+!standard 3.10.1(23)
+!standard 3.10.2(41)
+!standard 4.2.1(0)
+!standard 4.3.3(44)
+!standard 4.3.5(0)
+!standard 4.5.7(21/3)
+!standard 4.5.8(13/3)
+!standard 4.5.10(0)
+!standard 5.5(21)
+!standard 6.1.1(42/3)
+!standard 6.1.2(0)
+!standard 7.3.2(24/3)
+!standard 7.3.3(0)
+!standard 11.3(7)
+!standard 13.4(12)
+!standard 13.4(14)
+!standard B.3(77)
+!standard B.3(79/3)
+!standard B.3(83)
 !class presentation 19-02-07
 !status Amendment 1-2012 19-10-29
 !status ARG Approved 10-0-0  19-10-06
@@ -23,6 +42,14 @@
 
 !wording
 
+Modify 3.9.4(32/2):
+
+...
+-- Add [George]{Casey} (see 3.10.1) to the cashier's queue:
+Append (Cashier, [George]{Casey});
+-- After payment, move [George]{Casey} to the sandwich counter queue:
+Transfer (Cashier, Counter);
+
 Modify 3.10.1(23):
 
 My_Car, Your_Car, Next_Car : Car_Name := new Car;  -- see 4.8
@@ -35,6 +62,14 @@
 and googling famous people named Casey produces about an even mix of the sexes.
 Chris produced mostly male for example, and Pat was also heavily male oriented]
 
+Modify 3.10.2(41):
+
+Martha : Person_Name := new Person(F);       -- see 3.10.1
+Cars   : array (1..2) of aliased Car;
+   ...
+Martha.Vehicle := Cars(1)'Access;
+[George]{Casey}.Vehicle := Cars(2)'Access;
+
 Append after 4.2.1(9/5):
 
 Examples
@@ -45,7 +80,7 @@
 
    Max_Roman_Number : constant := 3_999;  -- MMMCMXCIX
 
-   subtype Roman_Number is Positive range 1 .. Max_Roman_Number
+   type Roman_Number is range 1 .. Max_Roman_Number
       with String_Literal => To_Roman_Number;
 
    function To_Roman_Number (S : String) return Roman_Number
@@ -61,9 +96,9 @@
             'Reduce("+", 0)
      );
 
-  X : Roman_Number := "III" * "IV" * "XII"; -- 144 ( i.e. CXLIV)
+  X : Roman_Number := "III" * "IV" * "XII"; -- 144 (that is, CXLIV)
 
-Append after 4.3.3(47/5):
+Append after 4.3.3(46/5):
 
 Empty_Matrix : constant Matrix := []; -- A matrix without elements
 
@@ -78,16 +113,16 @@
 Append after 4.5.7(21/3):
 
 Examples
-   Put_Line ("Casey is " & (if Casey.Sex = M then "Male" else "Female")); -- See 3.10.1
+   Put_Line ("Casey is " & (if Casey.Sex = M then "Male" else "Female")); -- see 3.10.1
 
-   function Card_Color (Card : Suit) return Color is --  See 3.5.1
+   function Card_Color (Card : Suit) return Color is -- see 3.5.1
      (case Card is
          when Clubs  | Spades   => Black,
          when Hearts | Diamonds => Red);
 
 Modify 4.5.8 (13/3):
 
-pragma Assert (for some X in 2 .. N {when X * X <= N}[/ 2] => N mod X = 0);  --  See iterator_filter in 5.5
+pragma Assert (for some X in 2 .. N {when X * X <= N}[/ 2] => N mod X = 0); {-- see iterator_filter in 5.5}
 
 Append after 4.5.10 (53/5):
 
@@ -112,11 +147,11 @@
         Acc.Sum / Real(Acc.Count));
 
 Modify 5.5(22/5):
-"Example{s} of [a] parallel loop{s}: "
+"Example of a {simple} parallel loop{s}: "
 
 Add after 5.5(23/5):
 
-Example of a parallel loop with a chunk specification
+Example of a parallel loop with a chunk specification:
 
 declare
    subtype Chunk_Number is Natural range 1 .. 8;
@@ -152,9 +187,8 @@
 Append after 6.1.2(50/5):
 
 NOTES
-
-For an example of the use of these aspects, see the Vector container definition
-in A.18.2.
+For an example of the use of these aspects and attributes, see the Vector 
+container definition in A.18.2.
 
 Append after 7.3.2(24/3):
 
@@ -224,9 +258,13 @@
 
 Append after 11.3(7):
 
-For an example of a raise expression, see the Streams Subsystem definitions in
+-- For an example of a raise expression, see the Streams Subsystem definitions in
 13.13.1.
 
+Modify 13.4(12):
+
+Example{s} of [an] enumeration representation clause{s}:
+
 Append after 13.4(14):
 
    -- See 3.5.2
@@ -238,10 +276,11 @@
                         'D' => 500,
                         'M' => 1000);
 
-For an example of the use of attribute Enum_Rep, see 4.2.1.
+   -- For an example of the use of attribute Enum_Rep, see 4.2.1.
 
-Modify B.3(78/3):
---Calling the C Library Function{s} strcpy{, and printf}
+Modify B.3(77):
+
+--Calling the C Library Function{s} strcpy{ and printf}
 with Interfaces.C;
 procedure Test is
    package C renames Interfaces.C;
@@ -252,23 +291,20 @@
    --     into the array pointed to by s1. If copying takes place between objects that overlap,
    --     the behavior is undefined. The strcpy function returns the value of s1.
 
-Append after B.3(78/3):
+Append after B.3(78/3): [Editor's note: Use the deleted paragraph here.]
 
    -- Call <sdtio.h>printf:
    -- C definition of printf:  int printf ( const char * format, ... );
-   --    This function writes the C string pointed by format to the standard
-   --    output (stdout). If format includes format specifiers (subsequences
-   --    beginning with %), the additional arguments following format are
-   --    formatted and inserted in the resulting string replacing their
-   --    respective specifiers. If the number of arguments does not match
-   --    the number of format specifiers, or if the types of the arguments
-   --    do not match the corresponding format specifier, the behaviour is
-   --    undefined. On success, the printf function returns the total
-   --    number of characters written to the standard output. If a writing
-   --    error occurs, a negative number is returned.
+   --    This function writes the C string pointed by format to the standard output (stdout).
+   --    If format includes format specifiers (subsequences beginning with %), the additional 
+   --    arguments following format are formatted and inserted in the resulting string 
+   --    replacing their respective specifiers. If the number of arguments does not match
+   --    the number of format specifiers, or if the types of the arguments do not match
+   --    the corresponding format specifier, the behaviour is undefined. On success, the 
+   --    printf function returns the total number of characters written to the standard output.
+   --    If a writing error occurs, a negative number is returned.
 
    -- Note: since the C function's return value is of no interest, the Ada interface is a procedure
-
    procedure Printf (Format : in C.char_array)
       with Import => True, Convention => C_Variadic_1, External_Name => "printf";
 
@@ -276,6 +312,7 @@
 
  Printf("The String=%s, Length=%d", Chars1, Chars1'Length);
 
+
 !discussion
 
 A survey of the RM found that there were no examples in the
@@ -302,6 +339,332 @@
 explicit subtype mark. It seems to not be worthwhile to add another
 example where the subtype mark is implicit.
 
+!corrigendum 3.9.4(32/2)
+
+@drepl
+@xcode<...
+--@ft<@i< Add George (see 3.10.1) to the cashier's queue:>>
+Append (Cashier, George);
+--@ft<@i< After payment, move George to the sandwich counter queue:>>
+Transfer (Cashier, Counter);
+...>
+@dby
+@xcode<...
+--@ft<@i< Add Casey (see 3.10.1) to the cashier's queue:>>
+Append (Cashier, Casey);
+--@ft<@i< After payment, move Casey to the sandwich counter queue:>>
+Transfer (Cashier, Counter);
+...>
+
+!corrigendum 3.10.1(23)
+
+@drepl
+@xcode<My_Car, Your_Car, Next_Car : Car_Name := @b<new> Car;  --@ft<@i< see 4.8>>
+George : Person_Name := @b<new> Person(M);
+   ...
+George.Vehicle := Your_Car;>
+@dby
+@xcode<My_Car, Your_Car, Next_Car : Car_Name := @b<new> Car;  --@ft<@i< see 4.8>>
+Casey : Person_Name := @b<new> Person(M);
+   ...
+Casey.Vehicle := Your_Car;>
+
+!corrigendum 3.10.2(41)
+
+@drepl
+@xcode<Martha : Person_Name := @b<new> Person(F);       --@ft<@i< see 3.10.1>>
+Cars   : @b<array> (1..2) @b<of aliased> Car;
+   ...
+Martha.Vehicle := Cars(1)'Access;
+George.Vehicle := Cars(2)'Access;>
+@dby
+@xcode<Becky : Person_Name := @b<new> Person(F);       --@ft<@i< see 3.10.1>>
+Cars  : @b<array> (1..2) @b<of aliased> Car;
+   ...
+Becky.Vehicle := Cars(1)'Access;
+Casey.Vehicle := Cars(2)'Access;>
+
+!corrigendum 4.2.1(0)
+
+@insc
+See the conflict file for the changes.
+
+!corrigendum 4.3.3(43)
+
+@dinsa
+@xcode<D : Bit_Vector(M .. N) := (M .. N =@> True);         --@ft<@i< see 3.6>>
+E : Bit_Vector(M .. N) := (@b<others> =@> True);
+F : String(1 .. 1) := (1 =@> 'F');  --@ft<@i< a one component aggregate: same as "F">>>
+@dinst
+@xcode<Empty_Matrix : @b<constant> Matrix := []; --@ft<@i< A matrix without elements>>>
+
+!corrigendum 4.3.5(0)
+
+@insc
+See the conflict file for the changes.
+
+!corrigendum 4.5.7(21/3)
+
+@dinsa
+For the evaluation of a @fa<case_expression>, the @i<selecting_>@fa<expression> is
+first evaluated. If the value of the @i<selecting_>@fa<expression> is covered by the
+@fa<discrete_choice_list> of some @fa<case_expression_alternative>, then the
+@i<dependent_>@fa<expression> of the @fa<case_expression_alternative> is
+evaluated, converted to the type of the @fa<case_expression>, and the resulting
+value is the value of the @fa<case_expression>. Otherwise (the value is not covered by
+any @fa<discrete_choice_list>, perhaps due to being outside the base range),
+Constraint_Error is raised.
+@dinss
+@s8<@i<Examples>>
+
+@xcode<Put_Line ("Casey is " & (@b<if> Casey.Sex = M @b<then> "Male" @b<else> "Female")); --@ft<@i< see 3.10.1>>>
+
+@xcode<@b<function> Card_Color (Card : Suit) @b<return> Color @b<is> --@ft<@i< see 3.5.1>>
+  (@b<case> Card @b<is>
+      @b<when> Clubs  | Spades   =@> Black,
+      @b<when> Hearts | Diamonds =@> Red);>
+
+!corrigendum 4.5.8(13/3)
+
+@drepl
+@xcode<@b<pragma> Assert (@b<for some> X @b<in> 2 .. N / 2 =@> N @b<mod> X = 0);>
+@dby
+@xcode<@b<pragma> Assert (@b<for some> X @b<in> 2 .. N @b<when> X * X <= N =@> N @b<mod> X = 0);
+   --@ft<@i< see >>@fa<iterator_filter>@ft<@i< in 5.5>>>
+
+!corrigendum 4.3.5(0)
+
+@insc
+See the conflict file for the changes.
+
+!corrigendum 5.5(21)
+
+@dinsa
+@xcode<Summation:
+   @b<while> Next /= Head @b<loop>       -- @ft<@i<see 3.10.1>>
+      Sum  := Sum + Next.Value;
+      Next := Next.Succ;
+   @b<end loop> Summation;>
+@dinss
+@i<Example of a simple parallel loop:>
+
+@xcode<-- @ft<@i<see 3.6>>
+@b<parallel>
+@b<for> I @b<in> Grid'Range(1) @b<loop>
+   Grid(I, 1) := (@b<for all> J @b<in> Grid'Range(2) =@> Grid(I,J) = True);
+@b<end loop>;>
+
+@i<Example of a parallel loop with a chunk specification:>
+
+@xcode<declare
+   subtype Chunk_Number is Natural range 1 .. 8;
+
+@xcode<   Partial_Sum,
+   Partial_Max : array (Chunk_Number) of Natural := (others => 0);
+   Partial_Min : array (Chunk_Number) of Natural := (others => Natural'Last);
+
+@xcode<begin
+   @b<parallel> (Chunk @b<in> Chunk_Number)
+   @b<for> I @b<in> Grid'Range(1) @b<loop>
+      @b<declare>
+         True_Count : @b<constant> Natural :=
+           [@b<for> J @b<in> Grid'Range(2) =@> (@b<if> Grid (I, J) @b<then> 1 @b<else> 0)]'Reduce("+",0);
+      @b<begin>
+         Partial_Sum (Chunk) := @@ + True_Count;
+         Partial_Min (Chunk) := Natural'Min(@@, True_Count);
+         Partial_Max (Chunk) := Natural'Max(@@, True_Count);
+      @b<end>;
+   @b<end loop>;>
+
+@xcode<   Put_Line("Total=" & Partial_Sum'Reduce("+", 0) &
+            ", Min=" & Partial_Min'Reduce(Natural'Min, Natural'Last) &
+            ", Max=" & Partial_Max'Reduce(Natural'Max, 0));
+@b<end>;>
+
+!corrigendum 6.1.1(42/2)
+
+@dinsa
+@s9<NOTES@hr
+A precondition is checked just before the call. If another task can
+change any value that the precondition expression depends on, the precondition
+need not hold within the subprogram or entry body.>
+@dinst
+@s9<For an example of the use of these aspects and attributes, see the Streams
+Subsystem definitions in 13.13.1.>
+
+!corrigendum 6.1.2(0)
+
+@insc
+See the conflict file for the changes.
+
+!corrigendum 7.3.2(24/3)
+
+@dinsa
+@s9<NOTES@hr
+13  For a call of a primitive subprogram of type @i<NT> that is inherited 
+from type @i<T>, the specified checks of the specific invariants of both 
+the types @i<NT> and @i<T> are performed. For a call of a primitive subprogram 
+of type @i<NT> that is overridden for type @i<NT>, the specified checks of the 
+specific invariants of only type @i<NT> are performed.>
+@dinss
+
+@s8<@i<Examples>>
+
+@i<A work scheduler where only urgent work can be scheduled for weekends:>
+
+@xcode<@b<package> Work_Orders @b<is>>
+
+@xcode<   --@ft<@i< See 3.5.1 for type declarations of Level, Day, and Weekday>>>
+
+@xcode<   @b<type> Work_Order @b<is private with>
+     Type_Invariant =@> Day_Scheduled (Work_Order) @b<in> Weekday
+                       @b<or else> Priority (Work_Order) = Urgent;>
+
+@xcode<   @b<function> Schedule_Work (Urgency  : @b<in> Level;
+                           To_Occur : @b<in> Day) @b<return> Work_Order
+     @b<with> Pre =@> Urgency = Urgent @b<or else> To_Occur @b<in> Weekday;>
+
+@xcode<   @b<function> Day_Scheduled (Order : @b<in> Work_Order) @b<return> Day;>
+
+@xcode<   @b<function> Priority (Order : @b<in> Work_Order) @b<return> Level;>
+
+@xcode<   @b<procedure> Change_Priority (Order        : @b<in out> Work_Order;
+                              New_Priority : @b<in>     Level;
+                              Changed      : @b<out>    Boolean)
+      @b<with> Post =@> Changed = (Day_Scheduled(Order) @b<in> Weekday
+                              @b<or else> Priority(Order) = Urgent);>
+@xcode<@b<private>>
+
+@xcode<   @b<type> Work_Order @b<is record>
+      Scheduled : Day;
+      Urgency   : Level;
+   @b<end record>;>
+
+@xcode<@b<end> Work_Orders;>
+
+@xcode<@b<package body> Work_Orders @b<is>>
+
+@xcode<   @b<function> Schedule_Work (Urgency  : @b<in> Level;
+                           To_Occur : @b<in> Day) @b<return> Work_Order @b<is>
+     (Scheduled =@> To_Occur, Urgency =@> Urgency);>
+
+@xcode<   @b<function> Day_Scheduled (Order : @b<in> Work_Order) @b<return> Day @b<is> (Order.Scheduled);>
+
+@xcode<   @b<function> Priority (Order : @b<in> Work_Order) @b<return> Level @b<is> (Order.Urgency);>
+
+@xcode<   @b<procedure> Change_Priority (Order        : @b<in out> Work_Order;
+                              New_Priority : @b<in>     Level;
+                              Changed      : @b<out>    Boolean) @b<is>
+   @b<begin>
+      --@ft<@i< Ensure type invariant is not violated>>
+      @b<if> Order.Urgency = Urgent @b<or else> (Order.Scheduled @b<in> Weekday) @b<then>
+         Changed := True;
+         Order.Urgency := New_Priority;
+      @b<else>
+         Changed := False;
+      @b<end if>;
+   @b<end> Change_Priority;>
+
+@xcode<@b<end> Work_Orders;>
+
+
+!corrigendum 7.3.3(0)
+
+@insc
+See the conflict file for the changes.
+
+!corrigendum 11.3(7)
+
+@dinsa
+@xcode<@b<raise>;                                --@ft<@i< re-raise the current exception>>>
+@dinst
+@xcode<--@ft<@i< For an example of a raise expression, see the Streams Subsystem definitions in 13.13.1.>>>
+
+
+!corrigendum 13.4(12)
+
+@drepl
+@i<Example of an enumeration representation clause:>
+@dby
+@i<Examples of enumeration representation clauses:>
+
+!corrigendum 13.4(14)
+
+@dinsa
+@xcode<@b<for> Mix_Code @b<use>
+   (ADD =@> 1, SUB =@> 2, MUL =@> 3, LDA =@> 8, STA =@> 24, STZ =@>33);>
+@dinss
+@xcode<--@ft<@i< See 3.5.2.>>
+@b<for> Roman_Digit @b<use> ('I' =@> 1,
+                     'V' =@> 5,
+                     'X' =@> 10,
+                     'L' =@> 50,
+                     'C' =@> 100,
+                     'D' =@> 500,
+                     'M' =@> 1000);>
+
+@xcode<--@ft<@i< For an example of the use of attribute Enum_Rep, see 4.2.1.>>>
+
+
+!corrigendum B.3(77)
+
+@drepl
+@xcode<@ft<@i<--Calling the C Library Function strcpy>>
+@b<with> Interfaces.C;
+@b<procedure> Test @b<is>
+   @b<package> C @b<renames> Interfaces.C;
+   @b<use type> C.char_array;
+   @ft<@i<-- Call <string.h@>strcpy:>>
+   @ft<@i<-- C definition of strcpy:  char *strcpy(char *s1, const char *s2);>>
+   @ft<@i<--    This function copies the string pointed to by s2 (including the terminating null character)>>
+   @ft<@i<--     into the array pointed to by s1. If copying takes place between objects that overlap,>>
+   @ft<@i<--     the behavior is undefined. The strcpy function returns the value of s1.>>>
+@dby
+
+@xcode<@ft<@i<--Calling the C Library Functions strcpy and printf>>
+@b<with> Interfaces.C;
+@b<procedure> Test @b<is>
+   @b<package> C @b<renames> Interfaces.C;
+   @b<use type> C.char_array;
+   @ft<@i<-- Call <string.h@>strcpy:>>
+   @ft<@i<-- C definition of strcpy:  char *strcpy(char *s1, const char *s2);>>
+   @ft<@i<--    This function copies the string pointed to by s2 (including the terminating null character)>>
+   @ft<@i<--     into the array pointed to by s1. If copying takes place between objects that overlap,>>
+   @ft<@i<--     the behavior is undefined. The strcpy function returns the value of s1.>>>
+
+!corrigendum B.3(78/3)
+
+@dinsa
+@xcode<   @ft<@i<-- Note: since the C function's return value is of no interest, the Ada interface is a procedure>>
+   @b<procedure> Strcpy (Target : @b<out> C.char_array;
+                     Source : @b<in>  C.char_array)
+      @b<with> Import =@> True, Convention =@> C, External_Name =@> "strcpy";>
+@dinss
+@xcode<   @ft<@i<-- Call <sdtio.h@>printf:>>
+   @ft<@i<-- C definition of printf:  int printf ( const char * format, ... );>>
+   @ft<@i<--    This function writes the C string pointed by format to the standard output (stdout).>>
+   @ft<@i<--     If format includes format specifiers (subsequences beginning with %), the additional>> 
+   @ft<@i<--     arguments following format are formatted and inserted in the resulting string>>
+   @ft<@i<--     replacing their respective specifiers. If the number of arguments does not match>>
+   @ft<@i<--     the number of format specifiers, or if the types of the arguments do not match>>
+   @ft<@i<--     the corresponding format specifier, the behaviour is undefined. On success, the>>
+   @ft<@i<--     printf function returns the total number of characters written to the standard output.>>
+   @ft<@i<--     If a writing error occurs, a negative number is returned.>>>
+
+@xcode<   @ft<@i<-- Note: since the C function's return value is of no interest, the Ada interface is a procedure>>
+   @b<procedure> Printf (Format : @b<in> C.char_array)
+      @b<with> Import =@> True, Convention =@> C_Variadic_1, External_Name =@> "printf";>
+
+!corrigendum B.3(83)
+
+@drepl
+@xcode<@ft<@i<-- Now Chars1(1..6) = "qwert" & C.Nul>>>
+@dby
+@xcode<   @ft<@i<-- Now Chars1(1..6) = "qwert" & C.Nul>>>
+
+@xcode<   Printf("The String=%s, Length=%d", Chars1, Chars1'Length);>
+
+
 !ASIS
 
 None needed.
@@ -1817,5 +2180,85 @@
 the 'Enum_Rep attribute to do the conversion.
 
 Also the Work_Order example we reworked so that it could actually compile.
+
+****************************************************************
+
+From: Randy Brukardt
+Sent: Monday, November 11, 2019  7:07 PM
+
+Brad has in AI12-0312-1:
+
+Modify 3.10.1(23):
+
+My_Car, Your_Car, Next_Car : Car_Name := new Car;  -- see 4.8
+[George]{Casey} : Person_Name := new Person(M);
+   ...
+[George]{Casey}.Vehicle := Your_Car;
+
+
+However, the George object is used in the interface example in 3.9.4 (yes, a
+forward reference). We need to change the name in that as well:
+
+Modify 3.9.4(32/2):
+
+...
+-- Add [George]{Casey} (see 3.10.1) to the cashier's queue:
+Append (Cashier, [George]{Casey});
+-- After payment, move [George]{Casey} to the sandwich counter queue:
+Transfer (Cashier, Counter);
+
+It's also used in an example in the Heart of Darkness:
+
+Modify 3.10.2(41):
+
+Martha : Person_Name := new Person(F);       -- see 3.10.1
+Cars   : array (1..2) of aliased Car;
+   ...
+Martha.Vehicle := Cars(1)'Access;
+[George]{Casey}.Vehicle := Cars(2)'Access;
+
+
+I found this by looking for George in the Chapter 3 source file for the RM
+in order to change it, and I landed on some text that didn't match what I
+was expecting. (I did look through the entire RM source for any other uses
+of George and did not find any.)
+
+Consider this part of my editorial review for this AI.
+
+****************************************************************
+
+From: Randy Brukardt
+Sent: Monday, November 11, 2019  7:27 PM
+
+The example for 4.2.1 has:
+
+   subtype Roman_Number is Positive range 1 .. Max_Roman_Number
+      with String_Literal => To_Roman_Number;
+
+But String_Literal is a *type*-related operational attribute. It's not
+allowed on non-first subtypes by 13.1(8.1/3).
+
+Thus, Roman_Number has to be a type declaration:
+
+   type Roman_Number is range 1 .. Max_Roman_Number
+      with String_Literal => To_Roman_Number;
+
+...which is better anyway as it gets rid of the dependence on Positive.
+(Note that we certainly don't want type Integer allowing roman numerals as
+literals. :-)
+
+P.S. There is an "i.e." in this example as well, replaced with "that is".
+
+****************************************************************
+
+From: Randy Brukardt
+Sent: Monday, November 11, 2019  9:48 PM
+
+A reminder more than a bug: the example in 6.1.1 refers one to the memory 
+buffers declared in 13.13.1. If we decide to remove AI12-0293-1 (as suggested 
+by Bob and others), then we have to change this reference to something else. 
+Either the new string buffers (A.4.12) or any of the containers (A.18.2, etc.)
+would work. (We're looking for a language-defined package that contains a 
+number of Pre and Post aspects.)
 
 ****************************************************************

Questions? Ask the ACAA Technical Agent