[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Aug 2011 09:22:08 +0000 (11:22 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Aug 2011 09:22:08 +0000 (11:22 +0200)
2011-08-01  Pascal Obry  <obry@adacore.com>

* a-stzunb-shared.adb, a-strunb-shared.adb, a-stwiun-shared.adb:
Fix Replace_Slice when High is above current string size.
(Replace_Slice): Fix DL computation when High is above current
string length.

2011-08-01  Gary Dismukes  <dismukes@adacore.com>

* gnat_rm.texi: Add documentation for pragma Static_Elaboration_Desired.

From-SVN: r177004

gcc/ada/ChangeLog
gcc/ada/a-strunb-shared.adb
gcc/ada/a-stwiun-shared.adb
gcc/ada/a-stzunb-shared.adb
gcc/ada/gnat_rm.texi

index 68e005c52967b2991bf1b25015bcee686bf95695..12ba03bd7717532ad7d577e2d1765361a2942b22 100644 (file)
@@ -1,3 +1,14 @@
+2011-08-01  Pascal Obry  <obry@adacore.com>
+
+       * a-stzunb-shared.adb, a-strunb-shared.adb, a-stwiun-shared.adb:
+       Fix Replace_Slice when High is above current string size.
+       (Replace_Slice): Fix DL computation when High is above current
+       string length.
+
+2011-08-01  Gary Dismukes  <dismukes@adacore.com>
+
+       * gnat_rm.texi: Add documentation for pragma Static_Elaboration_Desired.
+
 2011-08-01  Matthew Heaney  <heaney@adacore.com>
 
        * a-rbtgbo.adb (Delete_Node_Sans_Free): Fixed assignment to left child
index bfa4875f5884f9254c486a42ea122642685c20aa..b0e413dde8b5b5fb7de06080af48f32c2eae1620 100644 (file)
@@ -1347,7 +1347,9 @@ package body Ada.Strings.Unbounded is
       --  Do replace operation when removed slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
@@ -1394,7 +1396,9 @@ package body Ada.Strings.Unbounded is
       --  Do replace operation only when replaced slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
index b06a9d0ec8f4ec5ce892e40ae5e154469ba02dc1..95b17eff5f846b572a05f2319a2a4e5bdf8dece3 100644 (file)
@@ -1359,7 +1359,9 @@ package body Ada.Strings.Wide_Unbounded is
       --  Do replace operation when removed slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
@@ -1406,7 +1408,9 @@ package body Ada.Strings.Wide_Unbounded is
       --  Do replace operation only when replaced slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
index 08c20a0fa3f4d5673f04b35c6e1de26c872b8994..965d856e182a1a5cb9edf3f29b814e0712224967 100644 (file)
@@ -1369,7 +1369,9 @@ package body Ada.Strings.Wide_Wide_Unbounded is
       --  Do replace operation when removed slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
@@ -1416,7 +1418,9 @@ package body Ada.Strings.Wide_Wide_Unbounded is
       --  Do replace operation only when replaced slice is not empty
 
       if High >= Low then
-         DL := By'Length + SR.Last + Low - High - 1;
+         DL := By'Length + SR.Last + Low - Integer'Min (High, SR.Last) - 1;
+         --  This is the number of characters remaining in the string after
+         --  replacing the slice.
 
          --  Result is empty string, reuse empty shared string
 
index 40e3c9142efc9b0297eeb0e24c3e0b4b5768902b..ead41e6c63801c82e62f3880fe56384a70a617c5 100644 (file)
@@ -192,6 +192,7 @@ Implementation Defined Pragmas
 * Pragma Source_File_Name::
 * Pragma Source_File_Name_Project::
 * Pragma Source_Reference::
+* Pragma Static_Elaboration_Desired::
 * Pragma Stream_Convert::
 * Pragma Style_Checks::
 * Pragma Subtitle::
@@ -817,6 +818,7 @@ consideration, the use of these pragmas should be minimized.
 * Pragma Source_File_Name::
 * Pragma Source_File_Name_Project::
 * Pragma Source_Reference::
+* Pragma Static_Elaboration_Desired::
 * Pragma Stream_Convert::
 * Pragma Style_Checks::
 * Pragma Subtitle::
@@ -4597,6 +4599,31 @@ The second argument must be a string literal, it cannot be a static
 string expression other than a string literal.  This is because its value
 is needed for error messages issued by all phases of the compiler.
 
+@node Pragma Static_Elaboration_Desired
+@unnumberedsec Pragma Static_Elaboration_Desired
+@findex Static_Elaboration_Desired
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Static_Elaboration_Desired;
+@end smallexample
+
+@noindent
+This pragma is used to indicate the desire for objects declared in the library
+unit to which the pragma applies to be initialized statically. This means that
+if an object is initialized (either explicitly or by default initialization),
+then the object's value can be determined at compile time and it requires no
+code to initialize it. This generally allows the object to be allocated in
+read-only data space. A warning is issued if an object or aggregate declared
+at the top level of the package cannot be initialized statically. Additionally,
+use of this pragma will suppress the generation of loops to initialize named
+aggregates whose only choice is an others choice that specifies a component
+value known at compile time, so that it can be allocated as static data. This
+is limited to aggregates with a maximum of 100 components. (See also the
+restriction No_Implicit_Loops, which supports static allocation for larger
+aggregates.)
+
 @node Pragma Stream_Convert
 @unnumberedsec Pragma Stream_Convert
 @findex Stream_Convert