This patch fixes the string operator for string and character
multiplication, to adjust to the semantics specified by the RR.  In
particular, multiplying by a negative number or zero must result in
the empty string.

Signed-off-by: Jose E. Marchesi <[email protected]>

gcc/algol68/ChangeLog

        * a68-low-strings.cc (a68_string_mult): Adjust to RR semantics for
        negative or zero factor argument.
        * ga68.texi (String operators): Adjust documentation accordingly.

gcc/testsuite/ChangeLog

        * algol68/execute/mult-char-1.a68: Multiplying a char or string by
        negative or zero factor results in the empty string.
        * algol68/execute/mult-string-3.a68: Likewise.
        * algol68/execute/mult-string-2.a68: Likewise.
        * algol68/execute/mult-string-1.a68: Likewise.
---
 gcc/algol68/a68-low-strings.cc                  | 9 ++++++---
 gcc/algol68/ga68.texi                           | 6 +++---
 gcc/testsuite/algol68/execute/mult-char-1.a68   | 6 ++++--
 gcc/testsuite/algol68/execute/mult-string-1.a68 | 8 ++++----
 gcc/testsuite/algol68/execute/mult-string-2.a68 | 8 ++++----
 gcc/testsuite/algol68/execute/mult-string-3.a68 | 8 ++++----
 6 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/gcc/algol68/a68-low-strings.cc b/gcc/algol68/a68-low-strings.cc
index 5af83bf944d..ea02397e9af 100644
--- a/gcc/algol68/a68-low-strings.cc
+++ b/gcc/algol68/a68-low-strings.cc
@@ -191,16 +191,19 @@ a68_string_mult (tree str, tree factor)
 
   str = save_expr (str);
   tree ssize_one_node = ssize_int (1);
-  tree res = a68_lower_tmpvar ("res%", CTYPE (M_STRING), str);
+  tree res = a68_lower_tmpvar ("res%", CTYPE (M_STRING),
+                              fold_build1 (INDIRECT_REF, CTYPE(M_STRING),
+                                           a68_low_gen (M_STRING, 0, NULL,
+                                                        false /* use_heap 
*/)));
   tree index = a68_lower_tmpvar ("index%", ssizetype, ssize_one_node);
 
   /* Begin of loop body.  */
   a68_push_range (NULL);
 
-  /* if (index == FACTOR) break;  */
+  /* if (index > FACTOR) break;  */
   a68_add_stmt (fold_build1 (EXIT_EXPR,
                             void_type_node,
-                            fold_build2 (GE_EXPR, ssizetype,
+                            fold_build2 (GT_EXPR, ssizetype,
                                          index,
                                          fold_convert (ssizetype, factor))));
 
diff --git a/gcc/algol68/ga68.texi b/gcc/algol68/ga68.texi
index bbf2387b61e..da19ddbb329 100644
--- a/gcc/algol68/ga68.texi
+++ b/gcc/algol68/ga68.texi
@@ -2754,9 +2754,9 @@ Dyadic operator that yields the concatenation of the 
given string
 
 @deftypefn Operator {} {*} (= (@B{int} a, @B{string} b) @B{string})
 @deftypefnx Operator {} {*} (= (@B{string} b, @B{int} a) @B{string})
-Dyadic operator that yields the string @code{a} concatenated @code{a}
-times to itself.  If @code{a} is less than zero then it is interpreted
-to be zero.
+Dyadic operator that yields the string composed of @code{a}
+concatenated copies of @code{b}.  If @code{a} is less than zero then
+it is interpreted to be zero.
 @end deftypefn
 
 @subsection Composition combined with assignation
diff --git a/gcc/testsuite/algol68/execute/mult-char-1.a68 
b/gcc/testsuite/algol68/execute/mult-char-1.a68
index 67af07323b4..5760697a5fe 100644
--- a/gcc/testsuite/algol68/execute/mult-char-1.a68
+++ b/gcc/testsuite/algol68/execute/mult-char-1.a68
@@ -1,8 +1,10 @@
 # { dg-options "-fstropping=upper" }  #
 BEGIN ASSERT ("a" * 3 = "aaa");
       ASSERT ("" * 1 = "");
-      ASSERT ("x" * 0 = "x");
+      ASSERT ("x" * -1= "");
+      ASSERT ("x" * 0 = "");
       ASSERT (3 * "a" = "aaa");
       ASSERT (1 * "" = "");
-      ASSERT (0 * "x" = "x")
+      ASSERT (0 * "x" = "");
+      ASSERT (-20 * "" = "")
 END
diff --git a/gcc/testsuite/algol68/execute/mult-string-1.a68 
b/gcc/testsuite/algol68/execute/mult-string-1.a68
index b0d49178bd1..db3afc658ca 100644
--- a/gcc/testsuite/algol68/execute/mult-string-1.a68
+++ b/gcc/testsuite/algol68/execute/mult-string-1.a68
@@ -1,9 +1,9 @@
 # { dg-options "-fstropping=upper" }  #
 BEGIN STRING foo = "foo";
-      ASSERT (foo * -10 = "foo");
-      ASSERT (-10 * foo = "foo");
-      ASSERT (foo * 0 = "foo");
-      ASSERT (0 * foo = "foo");
+      ASSERT (foo * -10 = "");
+      ASSERT (-10 * foo = "");
+      ASSERT (foo * 0 = "");
+      ASSERT (0 * foo = "");
       ASSERT (foo * 1 = "foo");
       ASSERT (1 * foo = "foo");
       ASSERT (foo * 2 = "foofoo");
diff --git a/gcc/testsuite/algol68/execute/mult-string-2.a68 
b/gcc/testsuite/algol68/execute/mult-string-2.a68
index 670dcbf16d6..b14083828d5 100644
--- a/gcc/testsuite/algol68/execute/mult-string-2.a68
+++ b/gcc/testsuite/algol68/execute/mult-string-2.a68
@@ -1,9 +1,9 @@
 # { dg-options "-fstropping=upper" }  #
 BEGIN []CHAR foo = ("f","o","o");
-      ASSERT (foo * -10 = "foo");
-      ASSERT (-10 * foo = "foo");
-      ASSERT (foo * 0 = "foo");
-      ASSERT (0 * foo = "foo");
+      ASSERT (foo * -10 = "");
+      ASSERT (-10 * foo = "");
+      ASSERT (foo * 0 = "");
+      ASSERT (0 * foo = "");
       ASSERT (foo * 1 = "foo");
       ASSERT (1 * foo = "foo");
       ASSERT (foo * 2 = "foofoo");
diff --git a/gcc/testsuite/algol68/execute/mult-string-3.a68 
b/gcc/testsuite/algol68/execute/mult-string-3.a68
index a8d3726d0df..54a859535b3 100644
--- a/gcc/testsuite/algol68/execute/mult-string-3.a68
+++ b/gcc/testsuite/algol68/execute/mult-string-3.a68
@@ -1,9 +1,9 @@
 # { dg-options "-fstropping=upper" }  #
 BEGIN FLEX[3]CHAR foo := ("f","o","o");
-      ASSERT (foo * -10 = "foo");
-      ASSERT (-10 * foo = "foo");
-      ASSERT (foo * 0 = "foo");
-      ASSERT (0 * foo = "foo");
+      ASSERT (foo * -10 = "");
+      ASSERT (-10 * foo = "");
+      ASSERT (foo * 0 = "");
+      ASSERT (0 * foo = "");
       ASSERT (foo * 1 = "foo");
       ASSERT (1 * foo = "foo");
       ASSERT (foo * 2 = "foofoo");
-- 
2.39.5

Reply via email to