Signed-off-by: Jose E. Marchesi <[email protected]>
gcc/testsuite/ChangeLog
* algol68/compile/a68includes/goodbye-supper.a68
* algol68/compile/a68includes/goodbye.a68: Likewise.
* algol68/compile/a68includes/hello-supper.a68: Likewise.
* algol68/compile/a68includes/hello.a68: Likewise.
* algol68/compile/actual-bounds-expected-1.a68: Likewise.
* algol68/compile/actual-bounds-expected-2.a68: Likewise.
* algol68/compile/actual-bounds-expected-3.a68: Likewise.
* algol68/compile/balancing-1.a68: Likewise.
* algol68/compile/bold-nestable-comment-1.a68: Likewise.
* algol68/compile/bold-taggle-1.a68: Likewise.
* algol68/compile/brief-nestable-comment-1.a68: Likewise.
* algol68/compile/brief-nestable-comment-2.a68: Likewise.
* algol68/compile/char-break-1.a68: Likewise.
* algol68/compile/compile.exp: Likewise.
* algol68/compile/conditional-clause-1.a68: Likewise.
* algol68/compile/error-bold-taggle-1.a68: Likewise.
* algol68/compile/error-coercion-1.a68: Likewise.
* algol68/compile/error-coercion-2.a68: Likewise.
* algol68/compile/error-coercion-flex-1.a68: Likewise.
* algol68/compile/error-conformance-clause-1.a68: Likewise.
* algol68/compile/error-contraction-1.a68: Likewise.
* algol68/compile/error-contraction-2.a68: Likewise.
* algol68/compile/error-incestuous-union-1.a68: Likewise.
* algol68/compile/error-label-after-decl-1.a68: Likewise.
* algol68/compile/error-nestable-comments-1.a68: Likewise.
* algol68/compile/error-nested-comment-1.a68: Likewise.
* algol68/compile/error-no-bounds-allowed-1.a68: Likewise.
* algol68/compile/error-string-break-1.a68: Likewise.
* algol68/compile/error-string-break-2.a68: Likewise.
* algol68/compile/error-string-break-3.a68: Likewise.
* algol68/compile/error-string-break-4.a68: Likewise.
* algol68/compile/error-string-break-5.a68: Likewise.
* algol68/compile/error-string-break-6.a68: Likewise.
* algol68/compile/error-string-break-7.a68: Likewise.
* algol68/compile/error-supper-1.a68: Likewise.
* algol68/compile/error-supper-2.a68: Likewise.
* algol68/compile/error-supper-3.a68: Likewise.
* algol68/compile/error-supper-4.a68: Likewise.
* algol68/compile/error-supper-5.a68: Likewise.
* algol68/compile/error-supper-6.a68: Likewise.
* algol68/compile/error-underscore-in-mode-1.a68: Likewise.
* algol68/compile/error-underscore-in-tag-1.a68: Likewise.
* algol68/compile/error-upper-1.a68: Likewise.
* algol68/compile/error-widening-1.a68: Likewise.
* algol68/compile/error-widening-2.a68: Likewise.
* algol68/compile/error-widening-3.a68: Likewise.
* algol68/compile/error-widening-4.a68: Likewise.
* algol68/compile/error-widening-5.a68: Likewise.
* algol68/compile/error-widening-6.a68: Likewise.
* algol68/compile/error-widening-7.a68: Likewise.
* algol68/compile/error-widening-8.a68: Likewise.
* algol68/compile/error-widening-9.a68: Likewise.
* algol68/compile/hidden-operators-1.a68: Likewise.
* algol68/compile/implicit-widening-1.a68: Likewise.
* algol68/compile/include-supper.a68: Likewise.
* algol68/compile/include.a68: Likewise.
* algol68/compile/labeled-unit-1.a68: Likewise.
* algol68/compile/nested-comment-1.a68: Likewise.
* algol68/compile/nested-comment-2.a68: Likewise.
* algol68/compile/operators-firmly-related.a68: Likewise.
* algol68/compile/recursive-modes-1.a68: Likewise.
* algol68/compile/recursive-modes-2.a68: Likewise.
* algol68/compile/serial-clause-jump-1.a68: Likewise.
* algol68/compile/snobol.a68: Likewise.
* algol68/compile/supper-1.a68: Likewise.
* algol68/compile/supper-10.a68: Likewise.
* algol68/compile/supper-11.a68: Likewise.
* algol68/compile/supper-12.a68: Likewise.
* algol68/compile/supper-13.a68: Likewise.
* algol68/compile/supper-2.a68: Likewise.
* algol68/compile/supper-3.a68: Likewise.
* algol68/compile/supper-4.a68: Likewise.
* algol68/compile/supper-5.a68: Likewise.
* algol68/compile/supper-6.a68: Likewise.
* algol68/compile/supper-7.a68: Likewise.
* algol68/compile/supper-8.a68: Likewise.
* algol68/compile/supper-9.a68: Likewise.
* algol68/compile/uniting-1.a68: Likewise.
* algol68/compile/upper-1.a68: Likewise.
* algol68/compile/warning-scope-1.a68: Likewise.
* algol68/compile/warning-scope-2.a68: Likewise.
* algol68/compile/warning-scope-3.a68: Likewise.
* algol68/compile/warning-scope-4.a68: Likewise.
* algol68/compile/warning-scope-5.a68: Likewise.
* algol68/compile/warning-scope-6.a68: Likewise.
* algol68/compile/warning-scope-7.a68: Likewise.
* algol68/compile/warning-voiding-1.a68: Likewise.
* algol68/compile/warning-voiding-2.a68: Likewise.
---
.../compile/a68includes/goodbye-supper.a68 | 4 +
.../algol68/compile/a68includes/goodbye.a68 | 8 +
.../compile/a68includes/hello-supper.a68 | 5 +
.../algol68/compile/a68includes/hello.a68 | 8 +
.../compile/actual-bounds-expected-1.a68 | 4 +
.../compile/actual-bounds-expected-2.a68 | 4 +
.../compile/actual-bounds-expected-3.a68 | 6 +
gcc/testsuite/algol68/compile/balancing-1.a68 | 7 +
.../compile/bold-nestable-comment-1.a68 | 7 +
.../algol68/compile/bold-taggle-1.a68 | 6 +
.../compile/brief-nestable-comment-1.a68 | 4 +
.../compile/brief-nestable-comment-2.a68 | 6 +
.../algol68/compile/char-break-1.a68 | 11 +
gcc/testsuite/algol68/compile/compile.exp | 34 +
.../algol68/compile/conditional-clause-1.a68 | 9 +
.../algol68/compile/error-bold-taggle-1.a68 | 6 +
.../algol68/compile/error-coercion-1.a68 | 5 +
.../algol68/compile/error-coercion-2.a68 | 6 +
.../algol68/compile/error-coercion-flex-1.a68 | 8 +
.../compile/error-conformance-clause-1.a68 | 8 +
.../algol68/compile/error-contraction-1.a68 | 6 +
.../algol68/compile/error-contraction-2.a68 | 8 +
.../compile/error-incestuous-union-1.a68 | 8 +
.../compile/error-label-after-decl-1.a68 | 8 +
.../compile/error-mode-stropping-1.a68 | 3 +
.../compile/error-mode-stropping-10.a68 | 3 +
.../compile/error-mode-stropping-11.a68 | 4 +
.../compile/error-mode-stropping-12.a68 | 3 +
.../compile/error-mode-stropping-13.a68 | 4 +
.../compile/error-mode-stropping-14.a68 | 3 +
.../compile/error-mode-stropping-15.a68 | 4 +
.../compile/error-mode-stropping-16.a68 | 3 +
.../compile/error-mode-stropping-17.a68 | 4 +
.../compile/error-mode-stropping-2.a68 | 4 +
.../compile/error-mode-stropping-3.a68 | 3 +
.../compile/error-mode-stropping-4.a68 | 4 +
.../compile/error-mode-stropping-5.a68 | 3 +
.../compile/error-mode-stropping-6.a68 | 4 +
.../compile/error-mode-stropping-8.a68 | 3 +
.../compile/error-mode-stropping-9.a68 | 4 +
.../compile/error-nestable-comments-1.a68 | 9 +
.../compile/error-nested-comment-1.a68 | 6 +
.../compile/error-no-bounds-allowed-1.a68 | 15 +
.../algol68/compile/error-string-break-1.a68 | 4 +
.../algol68/compile/error-string-break-2.a68 | 2 +
.../algol68/compile/error-string-break-3.a68 | 2 +
.../algol68/compile/error-string-break-4.a68 | 2 +
.../algol68/compile/error-string-break-5.a68 | 2 +
.../algol68/compile/error-string-break-6.a68 | 2 +
.../algol68/compile/error-string-break-7.a68 | 2 +
.../algol68/compile/error-stropping-5.a68 | 3 +
.../algol68/compile/error-stropping-6.a68 | 4 +
.../compile/error-stropping-keyword-1.a68 | 2 +
.../compile/error-stropping-keyword-2.a68 | 3 +
.../compile/error-stropping-keyword-3.a68 | 2 +
.../compile/error-stropping-keyword-4.a68 | 3 +
.../algol68/compile/error-supper-1.a68 | 3 +
.../algol68/compile/error-supper-2.a68 | 5 +
.../algol68/compile/error-supper-3.a68 | 5 +
.../algol68/compile/error-supper-4.a68 | 5 +
.../algol68/compile/error-supper-5.a68 | 5 +
.../algol68/compile/error-supper-6.a68 | 6 +
.../compile/error-underscore-in-mode-1.a68 | 7 +
.../compile/error-underscore-in-tag-1.a68 | 7 +
.../algol68/compile/error-upper-1.a68 | 3 +
.../algol68/compile/error-vacuum-1.a68 | 2 +
.../algol68/compile/error-vacuum-2.a68 | 2 +
.../algol68/compile/error-vacuum-3.a68 | 3 +
.../algol68/compile/error-widening-1.a68 | 6 +
.../algol68/compile/error-widening-2.a68 | 6 +
.../algol68/compile/error-widening-3.a68 | 10 +
.../algol68/compile/error-widening-4.a68 | 10 +
.../algol68/compile/error-widening-5.a68 | 6 +
.../algol68/compile/error-widening-6.a68 | 6 +
.../algol68/compile/error-widening-7.a68 | 6 +
.../algol68/compile/error-widening-8.a68 | 6 +
.../algol68/compile/error-widening-9.a68 | 10 +
.../algol68/compile/hidden-operators-1.a68 | 11 +
.../algol68/compile/implicit-widening-1.a68 | 10 +
.../algol68/compile/include-supper.a68 | 16 +
gcc/testsuite/algol68/compile/include.a68 | 19 +
.../algol68/compile/labeled-unit-1.a68 | 7 +
.../algol68/compile/nested-comment-1.a68 | 4 +
.../algol68/compile/nested-comment-2.a68 | 6 +
.../compile/operators-firmly-related.a68 | 7 +
.../algol68/compile/recursive-modes-1.a68 | 33 +
.../algol68/compile/recursive-modes-2.a68 | 7 +
.../algol68/compile/serial-clause-jump-1.a68 | 7 +
gcc/testsuite/algol68/compile/snobol.a68 | 1100 +++++++++++++++++
gcc/testsuite/algol68/compile/supper-1.a68 | 11 +
gcc/testsuite/algol68/compile/supper-10.a68 | 6 +
gcc/testsuite/algol68/compile/supper-11.a68 | 6 +
gcc/testsuite/algol68/compile/supper-12.a68 | 6 +
gcc/testsuite/algol68/compile/supper-13.a68 | 7 +
gcc/testsuite/algol68/compile/supper-2.a68 | 5 +
gcc/testsuite/algol68/compile/supper-3.a68 | 5 +
gcc/testsuite/algol68/compile/supper-4.a68 | 5 +
gcc/testsuite/algol68/compile/supper-5.a68 | 6 +
gcc/testsuite/algol68/compile/supper-6.a68 | 5 +
gcc/testsuite/algol68/compile/supper-7.a68 | 5 +
gcc/testsuite/algol68/compile/supper-8.a68 | 6 +
gcc/testsuite/algol68/compile/supper-9.a68 | 6 +
gcc/testsuite/algol68/compile/uniting-1.a68 | 8 +
gcc/testsuite/algol68/compile/upper-1.a68 | 11 +
.../algol68/compile/warning-scope-1.a68 | 9 +
.../algol68/compile/warning-scope-2.a68 | 8 +
.../algol68/compile/warning-scope-3.a68 | 3 +
.../algol68/compile/warning-scope-4.a68 | 3 +
.../algol68/compile/warning-scope-5.a68 | 8 +
.../algol68/compile/warning-scope-6.a68 | 6 +
.../algol68/compile/warning-scope-7.a68 | 12 +
.../algol68/compile/warning-voiding-1.a68 | 5 +
.../algol68/compile/warning-voiding-2.a68 | 6 +
113 files changed, 1809 insertions(+)
create mode 100644 gcc/testsuite/algol68/compile/a68includes/goodbye-supper.a68
create mode 100644 gcc/testsuite/algol68/compile/a68includes/goodbye.a68
create mode 100644 gcc/testsuite/algol68/compile/a68includes/hello-supper.a68
create mode 100644 gcc/testsuite/algol68/compile/a68includes/hello.a68
create mode 100644 gcc/testsuite/algol68/compile/actual-bounds-expected-1.a68
create mode 100644 gcc/testsuite/algol68/compile/actual-bounds-expected-2.a68
create mode 100644 gcc/testsuite/algol68/compile/actual-bounds-expected-3.a68
create mode 100644 gcc/testsuite/algol68/compile/balancing-1.a68
create mode 100644 gcc/testsuite/algol68/compile/bold-nestable-comment-1.a68
create mode 100644 gcc/testsuite/algol68/compile/bold-taggle-1.a68
create mode 100644 gcc/testsuite/algol68/compile/brief-nestable-comment-1.a68
create mode 100644 gcc/testsuite/algol68/compile/brief-nestable-comment-2.a68
create mode 100644 gcc/testsuite/algol68/compile/char-break-1.a68
create mode 100644 gcc/testsuite/algol68/compile/compile.exp
create mode 100644 gcc/testsuite/algol68/compile/conditional-clause-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-bold-taggle-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-coercion-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-coercion-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-coercion-flex-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-conformance-clause-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-contraction-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-contraction-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-incestuous-union-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-label-after-decl-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-10.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-11.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-12.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-13.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-14.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-15.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-16.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-17.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-4.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-5.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-6.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-8.a68
create mode 100644 gcc/testsuite/algol68/compile/error-mode-stropping-9.a68
create mode 100644 gcc/testsuite/algol68/compile/error-nestable-comments-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-nested-comment-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-no-bounds-allowed-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-4.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-5.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-6.a68
create mode 100644 gcc/testsuite/algol68/compile/error-string-break-7.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-5.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-6.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-keyword-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-keyword-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-keyword-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-stropping-keyword-4.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-4.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-5.a68
create mode 100644 gcc/testsuite/algol68/compile/error-supper-6.a68
create mode 100644 gcc/testsuite/algol68/compile/error-underscore-in-mode-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-underscore-in-tag-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-upper-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-vacuum-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-vacuum-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-vacuum-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-1.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-2.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-3.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-4.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-5.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-6.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-7.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-8.a68
create mode 100644 gcc/testsuite/algol68/compile/error-widening-9.a68
create mode 100644 gcc/testsuite/algol68/compile/hidden-operators-1.a68
create mode 100644 gcc/testsuite/algol68/compile/implicit-widening-1.a68
create mode 100644 gcc/testsuite/algol68/compile/include-supper.a68
create mode 100644 gcc/testsuite/algol68/compile/include.a68
create mode 100644 gcc/testsuite/algol68/compile/labeled-unit-1.a68
create mode 100644 gcc/testsuite/algol68/compile/nested-comment-1.a68
create mode 100644 gcc/testsuite/algol68/compile/nested-comment-2.a68
create mode 100644 gcc/testsuite/algol68/compile/operators-firmly-related.a68
create mode 100644 gcc/testsuite/algol68/compile/recursive-modes-1.a68
create mode 100644 gcc/testsuite/algol68/compile/recursive-modes-2.a68
create mode 100644 gcc/testsuite/algol68/compile/serial-clause-jump-1.a68
create mode 100644 gcc/testsuite/algol68/compile/snobol.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-1.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-10.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-11.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-12.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-13.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-2.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-3.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-4.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-5.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-6.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-7.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-8.a68
create mode 100644 gcc/testsuite/algol68/compile/supper-9.a68
create mode 100644 gcc/testsuite/algol68/compile/uniting-1.a68
create mode 100644 gcc/testsuite/algol68/compile/upper-1.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-1.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-2.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-3.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-4.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-5.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-6.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-scope-7.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-voiding-1.a68
create mode 100644 gcc/testsuite/algol68/compile/warning-voiding-2.a68
diff --git a/gcc/testsuite/algol68/compile/a68includes/goodbye-supper.a68
b/gcc/testsuite/algol68/compile/a68includes/goodbye-supper.a68
new file mode 100644
index 00000000000..c287d6a9309
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/a68includes/goodbye-supper.a68
@@ -0,0 +1,4 @@
+proc goodbye = (string name) string:
+begin string msg := "Goodbye " + name;
+ msg
+end;
diff --git a/gcc/testsuite/algol68/compile/a68includes/goodbye.a68
b/gcc/testsuite/algol68/compile/a68includes/goodbye.a68
new file mode 100644
index 00000000000..19c3acc5779
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/a68includes/goodbye.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+# PR UPPER PR #
+
+PROC goodbye = (STRING name) STRING:
+BEGIN
+ STRING msg := "Goodbye " + name;
+ msg
+END;
diff --git a/gcc/testsuite/algol68/compile/a68includes/hello-supper.a68
b/gcc/testsuite/algol68/compile/a68includes/hello-supper.a68
new file mode 100644
index 00000000000..2af568bcb01
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/a68includes/hello-supper.a68
@@ -0,0 +1,5 @@
+proc hello = (string name) string:
+begin string msg := "Hello " + name;
+ msg
+end;
+
diff --git a/gcc/testsuite/algol68/compile/a68includes/hello.a68
b/gcc/testsuite/algol68/compile/a68includes/hello.a68
new file mode 100644
index 00000000000..aa72e282d2c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/a68includes/hello.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+# PR UPPER PR #
+
+PROC hello = (STRING name) STRING:
+BEGIN
+ STRING msg := "Hello " + name;
+ msg
+END;
diff --git a/gcc/testsuite/algol68/compile/actual-bounds-expected-1.a68
b/gcc/testsuite/algol68/compile/actual-bounds-expected-1.a68
new file mode 100644
index 00000000000..58309db74fd
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/actual-bounds-expected-1.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN []INT a := (1,2,3); # { dg-error "actual bounds expected" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/actual-bounds-expected-2.a68
b/gcc/testsuite/algol68/compile/actual-bounds-expected-2.a68
new file mode 100644
index 00000000000..e80e8cb45c0
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/actual-bounds-expected-2.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN LOC[]INT a := (1,2,3); # { dg-error "actual bounds expected" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/actual-bounds-expected-3.a68
b/gcc/testsuite/algol68/compile/actual-bounds-expected-3.a68
new file mode 100644
index 00000000000..26ddd279f05
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/actual-bounds-expected-3.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN LOC[]INT a := (1,2,3), # { dg-error "actual bounds expected" } #
+ b := (4);
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/balancing-1.a68
b/gcc/testsuite/algol68/compile/balancing-1.a68
new file mode 100644
index 00000000000..62d1221f675
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/balancing-1.a68
@@ -0,0 +1,7 @@
+mode Word = union (void,real),
+ Rules = union (void,string);
+
+op LEN = (Word w) int: skip,
+LEN = (Rules r) int: skip;
+
+skip
diff --git a/gcc/testsuite/algol68/compile/bold-nestable-comment-1.a68
b/gcc/testsuite/algol68/compile/bold-nestable-comment-1.a68
new file mode 100644
index 00000000000..0820c3d20c2
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/bold-nestable-comment-1.a68
@@ -0,0 +1,7 @@
+# { dg-options {-fstropping=upper} } #
+# pr UPPER pr #
+BEGIN NOTE This is a
+ NOTE nestable ETON comment in bold style.
+ ETON
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/bold-taggle-1.a68
b/gcc/testsuite/algol68/compile/bold-taggle-1.a68
new file mode 100644
index 00000000000..77ce9e7c2fa
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/bold-taggle-1.a68
@@ -0,0 +1,6 @@
+# { dg-options {-std=gnu68 -fstropping=upper} } #
+
+BEGIN MODE FOO_BAR = INT;
+ FOO_BAR foo_bar = 10;
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/brief-nestable-comment-1.a68
b/gcc/testsuite/algol68/compile/brief-nestable-comment-1.a68
new file mode 100644
index 00000000000..045b9b56d57
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/brief-nestable-comment-1.a68
@@ -0,0 +1,4 @@
+begin { This is a
+ { nestable } comment in brief style. }
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/brief-nestable-comment-2.a68
b/gcc/testsuite/algol68/compile/brief-nestable-comment-2.a68
new file mode 100644
index 00000000000..a4e5d3ebb87
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/brief-nestable-comment-2.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN NOTE This is a
+ { nestable } comment in brief style.
+ ETON
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/char-break-1.a68
b/gcc/testsuite/algol68/compile/char-break-1.a68
new file mode 100644
index 00000000000..8a43364919f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/char-break-1.a68
@@ -0,0 +1,11 @@
+{ Make sure char denotations with string breaks work. }
+begin prio % = 9;
+ op % = (char a) char: a;
+ assert (ABS %"'n" = 10);
+ assert (ABS %"'f" = 12);
+ assert (ABS %"'t" = 9);
+ assert (ABS %"'r" = 13);
+ assert (%"'( u0061)" = "a");
+ assert (%"'(U00000061 )" = "a");
+ assert (%"'(u1234)" = invalid_char)
+end
diff --git a/gcc/testsuite/algol68/compile/compile.exp
b/gcc/testsuite/algol68/compile/compile.exp
new file mode 100644
index 00000000000..68fa5fa2625
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/compile.exp
@@ -0,0 +1,34 @@
+# Copyright (C) 2024 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Compile tests, no torture testing.
+#
+# These tests raise errors in the front end; torture testing doesn't apply.
+
+load_lib algol68-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+set saved-dg-do-what-default ${dg-do-what-default}
+
+set dg-do-what-default "compile"
+algol68-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.a68]] "" ""
+set dg-do-what-default ${saved-dg-do-what-default}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/algol68/compile/conditional-clause-1.a68
b/gcc/testsuite/algol68/compile/conditional-clause-1.a68
new file mode 100644
index 00000000000..a727bc21e58
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/conditional-clause-1.a68
@@ -0,0 +1,9 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN INT i := 26;
+ IF INT ii = i * 2; ii > 50 THEN
+ ii
+ ELIF i = 10 THEN
+ 100
+ FI
+END
diff --git a/gcc/testsuite/algol68/compile/error-bold-taggle-1.a68
b/gcc/testsuite/algol68/compile/error-bold-taggle-1.a68
new file mode 100644
index 00000000000..d813e55e5ba
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-bold-taggle-1.a68
@@ -0,0 +1,6 @@
+# { dg-options {-std=algol68 -fstropping=upper} } #
+
+BEGIN MODE FOO_BAR = INT; # { dg-error "unworthy" } #
+ FOO_BAR foo_bar = 10;
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-coercion-1.a68
b/gcc/testsuite/algol68/compile/error-coercion-1.a68
new file mode 100644
index 00000000000..d0e24821f27
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-coercion-1.a68
@@ -0,0 +1,5 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN INT a;
+ a := "foo" # { dg-error "cannot be coerced" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-coercion-2.a68
b/gcc/testsuite/algol68/compile/error-coercion-2.a68
new file mode 100644
index 00000000000..bb8de3064b5
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-coercion-2.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+# This is Example 4.2.6c in McGETTRICK[78]. #
+BEGIN []STRUCT([]INT a) r = (1,2,3); # { dg-error "cannot be coerced" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-coercion-flex-1.a68
b/gcc/testsuite/algol68/compile/error-coercion-flex-1.a68
new file mode 100644
index 00000000000..c556d703b40
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-coercion-flex-1.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+
+# Coercing from REF FLEX[]REAL to REF[]REAL is not allowed, since
+ flexibility shall match #
+BEGIN FLEX[1:0] REAL rowvar := SKIP;
+ REF [] REAL xlm = rowvar; # { dg-error "FLEX.*cannot be coerced" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-conformance-clause-1.a68
b/gcc/testsuite/algol68/compile/error-conformance-clause-1.a68
new file mode 100644
index 00000000000..e6cb738a2c9
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-conformance-clause-1.a68
@@ -0,0 +1,8 @@
+{ This is an invalid program. }
+begin case
+ if true then "foo" else 10 fi { dg-error "not a united mode" }
+ in (string): skip,
+ (int): skip
+ esac
+end
+
diff --git a/gcc/testsuite/algol68/compile/error-contraction-1.a68
b/gcc/testsuite/algol68/compile/error-contraction-1.a68
new file mode 100644
index 00000000000..f2bce73ff17
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-contraction-1.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+# Contracting mixed collateral variable and constant declarations is
+ not allowed.
+#
+(INT foo = 100, bar := 200) # { dg-error "mixed" } #
diff --git a/gcc/testsuite/algol68/compile/error-contraction-2.a68
b/gcc/testsuite/algol68/compile/error-contraction-2.a68
new file mode 100644
index 00000000000..2115a4cbfab
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-contraction-2.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+
+# Contracting mixed collateral variable and constant declarations is
+ not allowed. #
+BEGIN PROC x = VOID: SKIP,
+ y := VOID: SKIP; # { dg-error "mixed" } #
+ x
+END
diff --git a/gcc/testsuite/algol68/compile/error-incestuous-union-1.a68
b/gcc/testsuite/algol68/compile/error-incestuous-union-1.a68
new file mode 100644
index 00000000000..519cb8a9af1
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-incestuous-union-1.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+
+# Union modes shall not contain modes which are firmly related, i.e.
+ it shall not be possible to coerce from one mode to another in a
+ firm context. #
+BEGIN UNION(INT, REF INT) incestuous; # { dg-error "has firmly related
components" } #
+ incestuous
+END
diff --git a/gcc/testsuite/algol68/compile/error-label-after-decl-1.a68
b/gcc/testsuite/algol68/compile/error-label-after-decl-1.a68
new file mode 100644
index 00000000000..670f8908af1
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-label-after-decl-1.a68
@@ -0,0 +1,8 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN GOTO end;
+ ASSERT(FALSE);
+end: 0;
+ INT i = 10; # { dg-error "declaration cannot follow" } #
+ i
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-1.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-1.a68
new file mode 100644
index 00000000000..7a619d8408f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-1.a68
@@ -0,0 +1,3 @@
+begin struct (int i, real r) j;
+ j := "joo" { dg-error "char.*struct \\(int i, real r\\)" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-10.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-10.a68
new file mode 100644
index 00000000000..fd70de7df0d
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-10.a68
@@ -0,0 +1,3 @@
+begin long long int j;
+ j := "joo" { dg-error "char.*long long int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-11.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-11.a68
new file mode 100644
index 00000000000..156d8d39aa6
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-11.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN LONG LONG INT j;
+ j := "joo" { dg-error "CHAR.*LONG LONG INT" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-12.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-12.a68
new file mode 100644
index 00000000000..0dda5beb414
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-12.a68
@@ -0,0 +1,3 @@
+begin short int j;
+ j := "joo" { dg-error "char.*short int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-13.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-13.a68
new file mode 100644
index 00000000000..84cf830e7ec
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-13.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN SHORT INT j;
+ j := "joo" { dg-error "CHAR.*SHORT INT" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-14.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-14.a68
new file mode 100644
index 00000000000..24bda0a6db9
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-14.a68
@@ -0,0 +1,3 @@
+begin short short int j;
+ j := "joo" { dg-error "char.*short short int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-15.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-15.a68
new file mode 100644
index 00000000000..0136fdb4f7b
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-15.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN SHORT SHORT INT j;
+ j := "joo" { dg-error "CHAR.*SHORT SHORT INT" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-16.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-16.a68
new file mode 100644
index 00000000000..82359e52d95
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-16.a68
@@ -0,0 +1,3 @@
+begin flex[1:0]int j;
+ j := "joo" { dg-error "char.*flex.*int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-17.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-17.a68
new file mode 100644
index 00000000000..e733c51c75f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-17.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN FLEX[1:0]INT j;
+ j := "joo" { dg-error "CHAR.*FLEX.*INT" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-2.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-2.a68
new file mode 100644
index 00000000000..f72b6dd1368
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-2.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN STRUCT (INT i, REAL r) j;
+ j := "joo" # { dg-error "CHAR.*STRUCT \\(INT i, REAL r\\)" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-3.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-3.a68
new file mode 100644
index 00000000000..eb672c49533
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-3.a68
@@ -0,0 +1,3 @@
+begin union (int,real) j;
+ j := "joo" { dg-error "char.*union \\( *real *, *int *\\)" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-4.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-4.a68
new file mode 100644
index 00000000000..42c6ee29b6d
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-4.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN UNION (INT,REAL) j;
+ j := "joo" { dg-error "CHAR.*UNION \\( *REAL *, *INT *\\)" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-5.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-5.a68
new file mode 100644
index 00000000000..0206d19f72f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-5.a68
@@ -0,0 +1,3 @@
+begin proc union (int,real) j;
+ j := "joo" { dg-error "char.*proc union \\( *real *, *int *\\)" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-6.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-6.a68
new file mode 100644
index 00000000000..5f8404363dd
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-6.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN PROC UNION (INT,REAL) j;
+ j := "joo" { dg-error "CHAR.*PROC UNION \\( *REAL *, *INT *\\)" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-8.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-8.a68
new file mode 100644
index 00000000000..49308860381
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-8.a68
@@ -0,0 +1,3 @@
+begin long int j;
+ j := "joo" { dg-error "char.*long int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-mode-stropping-9.a68
b/gcc/testsuite/algol68/compile/error-mode-stropping-9.a68
new file mode 100644
index 00000000000..dc20eb34a34
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-mode-stropping-9.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN LONG INT j;
+ j := "joo" { dg-error "CHAR.*LONG INT" }
+END
diff --git a/gcc/testsuite/algol68/compile/error-nestable-comments-1.a68
b/gcc/testsuite/algol68/compile/error-nestable-comments-1.a68
new file mode 100644
index 00000000000..df00a1a9970
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-nestable-comments-1.a68
@@ -0,0 +1,9 @@
+# { dg-options "-fstropping=upper" } #
+# pr UPPER pr #
+BEGIN NOTE This is a
+ NOTE nestable ETON comment in brief style.
+ ETON
+ { Another { comment }. }
+ NOTE invalid { nesting ETON of comments } # { dg-error "" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-nested-comment-1.a68
b/gcc/testsuite/algol68/compile/error-nested-comment-1.a68
new file mode 100644
index 00000000000..3c78f34a51a
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-nested-comment-1.a68
@@ -0,0 +1,6 @@
+{ The string in nested comment is in one logical line. }
+begin
+ { puts ("{'n { dg-error {} }
+"); { this prints foo }}
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-no-bounds-allowed-1.a68
b/gcc/testsuite/algol68/compile/error-no-bounds-allowed-1.a68
new file mode 100644
index 00000000000..75d66bc1715
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-no-bounds-allowed-1.a68
@@ -0,0 +1,15 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN [1:10]INT i,
+ [1:10]STRUCT(REF[]INT i, BOOL j) k,
+ [1:10]STRUCT([1:10]INT i, BOOL j) l,
+ [1:10]REF[]INT p;
+ # formal, so no bounds allowed: #
+ [1:10]PROC[1:10]INT q, # { dg-error "formal bounds expected" } #
+ STRUCT(REF[1:10]INT i, BOOLj) m, # { dg-error "virtual bounds expected"
} #
+ [1:10]REF[1:10]INT mn, # { dg-error "virtual bounds expected" } #
+ PROC([1:10]INT)VOID pp, # { dg-error "formal bounds expected" } #
+ UNION([1:10] INT, BOOL) nm, # { dg-error "formal bounds expected" } #
+ [1:10]INT u = (1); # { dg-error "formal bounds expected" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-string-break-1.a68
b/gcc/testsuite/algol68/compile/error-string-break-1.a68
new file mode 100644
index 00000000000..fd8e765ab48
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-1.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN puts ("hello '_ world") # { dg-error "invalid string break sequence" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-string-break-2.a68
b/gcc/testsuite/algol68/compile/error-string-break-2.a68
new file mode 100644
index 00000000000..465f8f80404
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-2.a68
@@ -0,0 +1,2 @@
+begin puts ("hello '(U0000) world") # { dg-error "eight" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-string-break-3.a68
b/gcc/testsuite/algol68/compile/error-string-break-3.a68
new file mode 100644
index 00000000000..e4cf8f6f1a3
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-3.a68
@@ -0,0 +1,2 @@
+begin puts ("hello '(u00) world") # { dg-error "four" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-string-break-4.a68
b/gcc/testsuite/algol68/compile/error-string-break-4.a68
new file mode 100644
index 00000000000..76adff9b2bc
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-4.a68
@@ -0,0 +1,2 @@
+begin puts ("hello '(u) world") # { dg-error "four" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-string-break-5.a68
b/gcc/testsuite/algol68/compile/error-string-break-5.a68
new file mode 100644
index 00000000000..c42589fde7c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-5.a68
@@ -0,0 +1,2 @@
+begin puts ("hello '(u0010u0020) world") # { dg-error "" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-string-break-6.a68
b/gcc/testsuite/algol68/compile/error-string-break-6.a68
new file mode 100644
index 00000000000..fed7d84b221
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-6.a68
@@ -0,0 +1,2 @@
+begin puts ("hello '(u0010'/) world") # { dg-error "" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-string-break-7.a68
b/gcc/testsuite/algol68/compile/error-string-break-7.a68
new file mode 100644
index 00000000000..58545e01ce1
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-string-break-7.a68
@@ -0,0 +1,2 @@
+begin puts ("'") # { dg-error "" } #
+end
diff --git a/gcc/testsuite/algol68/compile/error-stropping-5.a68
b/gcc/testsuite/algol68/compile/error-stropping-5.a68
new file mode 100644
index 00000000000..3190472129a
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-5.a68
@@ -0,0 +1,3 @@
+begin int j;
+ j := "joo" { dg-error "char.*int" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-stropping-6.a68
b/gcc/testsuite/algol68/compile/error-stropping-6.a68
new file mode 100644
index 00000000000..af6097df7c0
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-6.a68
@@ -0,0 +1,4 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN INT j;
+ j := "joo" # { dg-error "CHAR.*INT" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-stropping-keyword-1.a68
b/gcc/testsuite/algol68/compile/error-stropping-keyword-1.a68
new file mode 100644
index 00000000000..4bf549f91e3
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-keyword-1.a68
@@ -0,0 +1,2 @@
+begin for i to 10 skip od { dg-error "do" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-stropping-keyword-2.a68
b/gcc/testsuite/algol68/compile/error-stropping-keyword-2.a68
new file mode 100644
index 00000000000..a1e616deaeb
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-keyword-2.a68
@@ -0,0 +1,3 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN FOR i TO 10 SKIP OD # { dg-error "DO" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-stropping-keyword-3.a68
b/gcc/testsuite/algol68/compile/error-stropping-keyword-3.a68
new file mode 100644
index 00000000000..d1076e935bd
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-keyword-3.a68
@@ -0,0 +1,2 @@
+begin if then 10 else 20 fi { dg-error "if" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-stropping-keyword-4.a68
b/gcc/testsuite/algol68/compile/error-stropping-keyword-4.a68
new file mode 100644
index 00000000000..92b0b3b58cb
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-stropping-keyword-4.a68
@@ -0,0 +1,3 @@
+# { dg-options "-fstropping=upper" } #
+BEGIN IF THEN 10 ELSE 20 FI # { dg-error "IF" } #
+END
diff --git a/gcc/testsuite/algol68/compile/error-supper-1.a68
b/gcc/testsuite/algol68/compile/error-supper-1.a68
new file mode 100644
index 00000000000..f2646c41b7b
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-1.a68
@@ -0,0 +1,3 @@
+# { dg-options {-fstropping=upper} } #
+
+begin ~ end # { dg-error "" } #
diff --git a/gcc/testsuite/algol68/compile/error-supper-2.a68
b/gcc/testsuite/algol68/compile/error-supper-2.a68
new file mode 100644
index 00000000000..f8c6c284b20
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-2.a68
@@ -0,0 +1,5 @@
+# { dg-options {-fstropping=supper} } #
+
+begin int foo__bar = 10; # { dg-error "unworthy" } #
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-supper-3.a68
b/gcc/testsuite/algol68/compile/error-supper-3.a68
new file mode 100644
index 00000000000..a35730ce1f7
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-3.a68
@@ -0,0 +1,5 @@
+# { dg-options {-fstropping=supper} } #
+
+begin int _bar = 10; # { dg-error "unworthy" } #
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-supper-4.a68
b/gcc/testsuite/algol68/compile/error-supper-4.a68
new file mode 100644
index 00000000000..726f80638d6
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-4.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin int foo bar = 10; { dg-error "" }
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-supper-5.a68
b/gcc/testsuite/algol68/compile/error-supper-5.a68
new file mode 100644
index 00000000000..0cf51c519de
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-5.a68
@@ -0,0 +1,5 @@
+# { dg-options {-fstropping=supper} } #
+
+begin int foo__ = 10; # { dg-error "unworthy" } #
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-supper-6.a68
b/gcc/testsuite/algol68/compile/error-supper-6.a68
new file mode 100644
index 00000000000..c013b4894b3
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-supper-6.a68
@@ -0,0 +1,6 @@
+# { dg-options {-fstropping=supper} } #
+
+begin mode foo_Invalid = int; # { dg-error "Invalid" } #
+ foo_Invalid some_int = 10; # { dg-error "Invalid" } #
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-underscore-in-mode-1.a68
b/gcc/testsuite/algol68/compile/error-underscore-in-mode-1.a68
new file mode 100644
index 00000000000..2aa294d1f02
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-underscore-in-mode-1.a68
@@ -0,0 +1,7 @@
+# { dg-options "-fstropping=upper" } #
+
+# Underscores are unworthy characters if they are not trailing
+ either a taggle or, in UPPER stropping, a bold word. #
+BEGIN INT invalid_tag__; # { dg-error "unworthy character" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-underscore-in-tag-1.a68
b/gcc/testsuite/algol68/compile/error-underscore-in-tag-1.a68
new file mode 100644
index 00000000000..a5dcb86b6e1
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-underscore-in-tag-1.a68
@@ -0,0 +1,7 @@
+# { dg-options "-fstropping=upper" } #
+
+# Underscores are unworthy characters if they are not trailing a
+ taggle or, in UPPER stropping, a bold word.. #
+BEGIN MODE INVALID_BOLD_WORD__; # { dg-error "unworthy character" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/error-upper-1.a68
b/gcc/testsuite/algol68/compile/error-upper-1.a68
new file mode 100644
index 00000000000..053846972ac
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-upper-1.a68
@@ -0,0 +1,3 @@
+# { dg-options {-fstropping=supper} } #
+
+BEGIN ~ END # { dg-error "" } #
diff --git a/gcc/testsuite/algol68/compile/error-vacuum-1.a68
b/gcc/testsuite/algol68/compile/error-vacuum-1.a68
new file mode 100644
index 00000000000..0e724592e25
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-vacuum-1.a68
@@ -0,0 +1,2 @@
+begin { dg-error "" }
+end
diff --git a/gcc/testsuite/algol68/compile/error-vacuum-2.a68
b/gcc/testsuite/algol68/compile/error-vacuum-2.a68
new file mode 100644
index 00000000000..fe9716aeef4
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-vacuum-2.a68
@@ -0,0 +1,2 @@
+( { dg-error "" }
+)
diff --git a/gcc/testsuite/algol68/compile/error-vacuum-3.a68
b/gcc/testsuite/algol68/compile/error-vacuum-3.a68
new file mode 100644
index 00000000000..fc096002709
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-vacuum-3.a68
@@ -0,0 +1,3 @@
+begin struct(int i, real r) foo = (); { dg-error "" }
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/error-widening-1.a68
b/gcc/testsuite/algol68/compile/error-widening-1.a68
new file mode 100644
index 00000000000..38ea59afb28
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-1.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN INT a := 10;
+ LONG REAL l := a; # { dg-error "coerced" } #
+ l
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-2.a68
b/gcc/testsuite/algol68/compile/error-widening-2.a68
new file mode 100644
index 00000000000..3165d1b7113
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-2.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN INT a := 10;
+ LONG INT l := a; # { dg-error "coerced" } #
+ l
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-3.a68
b/gcc/testsuite/algol68/compile/error-widening-3.a68
new file mode 100644
index 00000000000..c4ffb305a62
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-3.a68
@@ -0,0 +1,10 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN INT d := 0;
+ INT y := 10;
+ LONG REAL x;
+ 2
+ + (d > 0 | x | # { dg-error "" } #
+ y
+ )
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-4.a68
b/gcc/testsuite/algol68/compile/error-widening-4.a68
new file mode 100644
index 00000000000..fa5b2072e17
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-4.a68
@@ -0,0 +1,10 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ INT d := 0;
+ LONG REAL x;
+ 2
+ + (d > 0 | x | # { dg-error "" } #
+ 10
+ )
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-5.a68
b/gcc/testsuite/algol68/compile/error-widening-5.a68
new file mode 100644
index 00000000000..a6198669c45
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-5.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ LONG INT d := 0; # { dg-error "coerced" } #
+ d
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-6.a68
b/gcc/testsuite/algol68/compile/error-widening-6.a68
new file mode 100644
index 00000000000..09512e21678
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-6.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ LONG LONG INT d := LONG 0; # { dg-error "coerced" } #
+ d
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-7.a68
b/gcc/testsuite/algol68/compile/error-widening-7.a68
new file mode 100644
index 00000000000..09352081583
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-7.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ LONG REAL d := 3.14; # { dg-error "coerced" } #
+ d
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-8.a68
b/gcc/testsuite/algol68/compile/error-widening-8.a68
new file mode 100644
index 00000000000..098f6c3b615
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-8.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ LONG LONG REAL d := LONG 3.14; # { dg-error "coerced" } #
+ d
+END
diff --git a/gcc/testsuite/algol68/compile/error-widening-9.a68
b/gcc/testsuite/algol68/compile/error-widening-9.a68
new file mode 100644
index 00000000000..4d092386b61
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-widening-9.a68
@@ -0,0 +1,10 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN
+ INT d := 0;
+ LONG LONG REAL x;
+ 2
+ + (d > 0 | x | # { dg-error "" } #
+ 10
+ )
+END
diff --git a/gcc/testsuite/algol68/compile/hidden-operators-1.a68
b/gcc/testsuite/algol68/compile/hidden-operators-1.a68
new file mode 100644
index 00000000000..d66242d67a6
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/hidden-operators-1.a68
@@ -0,0 +1,11 @@
+{ dg-options {-Whidden-declarations} }
+
+begin mode Trilean = union (void,bool);
+
+ Trilean unknown = empty;
+ op NOT = (Trilean a) Trilean: { dg-warning "hides" }
+ skip;
+ op AND = (Trilean a,b) Trilean: { dg-warning "hides" }
+ skip;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/implicit-widening-1.a68
b/gcc/testsuite/algol68/compile/implicit-widening-1.a68
new file mode 100644
index 00000000000..2fa010c12a7
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/implicit-widening-1.a68
@@ -0,0 +1,10 @@
+# { dg-options "-Wextensions -fstropping=upper" } #
+
+# This program shall compile without warning, because
+ widening from INT to REAL is legal in the strict language,
+ since they have the same size. #
+
+BEGIN BOOL cond;
+ REAL x, y;
+ y + (cond | x | 10)
+END
diff --git a/gcc/testsuite/algol68/compile/include-supper.a68
b/gcc/testsuite/algol68/compile/include-supper.a68
new file mode 100644
index 00000000000..af0521be101
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/include-supper.a68
@@ -0,0 +1,16 @@
+{ dg-options "-I$srcdir/algol68/compile/a68includes" }
+{ dg-additional-files "$srcdir/algol68/compile/a68includes/hello-supper.a68
$srcdir/algol68/compile/a68includes/goodbye-supper.a68" }
+
+begin string name := "Algol68 with supper!";
+ { Both files are in `./a68includes'.
+ The first one will be included because we uwed `-I.
+ The second one will be included because of the relative path. }
+ pr include "hello-supper.a68" pr
+ pr include "a68includes/goodbye-supper.a68" pr
+
+ string bye := goodbye(name);
+ string hi := hello(name);
+
+ puts(hi + "\n");
+ puts(bye + "\n")
+end
diff --git a/gcc/testsuite/algol68/compile/include.a68
b/gcc/testsuite/algol68/compile/include.a68
new file mode 100644
index 00000000000..6f4855b33da
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/include.a68
@@ -0,0 +1,19 @@
+# { dg-options "-I$srcdir/algol68/compile/a68includes -fstropping=upper" } #
+# { dg-additional-files "$srcdir/algol68/compile/a68includes/hello.a68
$srcdir/algol68/compile/a68includes/goodbye.a68" } #
+
+# PR UPPER PR #
+
+BEGIN STRING name := "Algol68!";
+ # Both files are in `./a68includes'.
+ The first one will be included because we used `-I'.
+ The second one will be included because of the relative path.
+ #
+ PR include "hello.a68" PR
+ PR include "a68includes/goodbye.a68" PR
+
+ STRING bye := goodbye(name);
+ STRING hi := hello(name);
+
+ puts(hi + "\n");
+ puts(bye + "\n")
+END
diff --git a/gcc/testsuite/algol68/compile/labeled-unit-1.a68
b/gcc/testsuite/algol68/compile/labeled-unit-1.a68
new file mode 100644
index 00000000000..d3dbd8c40d7
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/labeled-unit-1.a68
@@ -0,0 +1,7 @@
+# { dg-options "-fstropping=upper" } #
+
+# This tests that the mode of the value yielded by a labeled unit is
+ the mode of the unit. #
+BEGIN 10;
+jorl: 20
+END
diff --git a/gcc/testsuite/algol68/compile/nested-comment-1.a68
b/gcc/testsuite/algol68/compile/nested-comment-1.a68
new file mode 100644
index 00000000000..f5752435a0e
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/nested-comment-1.a68
@@ -0,0 +1,4 @@
+{ Comment delimiters within strings get ignored. }
+begin { puts { ("{""'n"); } }
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/nested-comment-2.a68
b/gcc/testsuite/algol68/compile/nested-comment-2.a68
new file mode 100644
index 00000000000..9fc912f2687
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/nested-comment-2.a68
@@ -0,0 +1,6 @@
+{ The string in nested comment is in one logical line. }
+begin
+ { puts ("{'n\
+"); { this prints foo }}
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/operators-firmly-related.a68
b/gcc/testsuite/algol68/compile/operators-firmly-related.a68
new file mode 100644
index 00000000000..a7efe750219
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/operators-firmly-related.a68
@@ -0,0 +1,7 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN PRIO MIN = 6;
+ OP MIN = (REF REAL a, b) REF REAL: (a < b | a | b), # { dg-error "firmly
related" } #
+ MIN = (REAL a, b) REAL: (a < b | a | b); # { dg-error "firmly
related" } #
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/recursive-modes-1.a68
b/gcc/testsuite/algol68/compile/recursive-modes-1.a68
new file mode 100644
index 00000000000..4a77a5646be
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/recursive-modes-1.a68
@@ -0,0 +1,33 @@
+# { dg-options "-fstropping=upper" } #
+
+# This program triggered a bug related to incomplete modes. #
+BEGIN MODE REC_MSET = STRUCT (REF REC_MSET_ELM head, tail,
+ INT num elems,
+ PROC(REC_MSET_DATA)BOOL gate),
+ REC_MSET_ELM = STRUCT (REC_MSET_DATA data, BOOL mark, REF
REC_MSET_ELM next),
+ REC_MSET_DATA = UNION (REC_RSET,REC_RECORD,REC_FIELD,REC_CMNT),
+ REC_RSET = STRUCT (REC_MSET mset,
+ INT min size, max size,
+ REF REC_RECORD descriptor),
+ REC_RECORD = STRUCT (REC_LOC loc, REC_MSET mset, INT foo),
+ REC_CMNT = STRUCT (REC_LOC loc, STRING content),
+ REC_FIELD = STRUCT (REC_LOC loc, STRING name, value),
+ REC_LOC = STRUCT (STRING source, INT line, char);
+
+ PROC rec loc unknown = REC_LOC:
+ ("unknown", 0, 0);
+ PROC rec record gate = (REC_MSET_DATA d) BOOL:
+ (d | (REC_FIELD): TRUE, (REC_CMNT): TRUE | FALSE);
+ REF REC_MSET_ELM rec no mset elm = NIL;
+
+ PROC rec mset new = (PROC(REC_MSET_DATA)BOOL gate) REC_MSET:
+ (HEAP REC_MSET := (rec no mset elm, rec no mset elm,
+ 0, gate));
+
+ REF REC_RECORD rec no record = NIL;
+
+ PROC rec record new = REF REC_RECORD:
+ HEAP REC_RECORD := (rec loc unknown, rec mset new (rec record gate),
0);
+
+ SKIP
+END
diff --git a/gcc/testsuite/algol68/compile/recursive-modes-2.a68
b/gcc/testsuite/algol68/compile/recursive-modes-2.a68
new file mode 100644
index 00000000000..f79b214d075
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/recursive-modes-2.a68
@@ -0,0 +1,7 @@
+begin mode Word = union (int, struct (ref Word w)),
+ Value = union (void,Word),
+ Stack = struct (ref Stack prev, Value val);
+
+ struct (Word a) qs; { type_2 has no size! }
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/serial-clause-jump-1.a68
b/gcc/testsuite/algol68/compile/serial-clause-jump-1.a68
new file mode 100644
index 00000000000..f4e3773ba53
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/serial-clause-jump-1.a68
@@ -0,0 +1,7 @@
+# { dg-options "-fstropping=upper" } #
+
+# This is an infinite loop, but it should compile just fine an yield
+ an integer after infinite time. #
+
+BEGIN foo: foo
+END
diff --git a/gcc/testsuite/algol68/compile/snobol.a68
b/gcc/testsuite/algol68/compile/snobol.a68
new file mode 100644
index 00000000000..9b6c4fc824f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/snobol.a68
@@ -0,0 +1,1100 @@
+# { dg-options "-fstropping=upper" } #
+
+# This is Frank Pagan's SNOBOL4 Interpreter in ALGOL 68 (1976),
+ fetched from Dick Grune's page https://dickgrune.com/CS/Algol68/
+
+ The interpreter described in "Algol 68 as an Implementation Language\
+ for Portable Interpreters", ACM SIGPLAN Notices - Proceedings of the
+ Strathclyde ALGOL 68 conference, Volume 12 Issue 6, June 1977,
+ pp. 54 - 62, and "A Highly-Structured Interpreter for a SNOBOL4
+ Subset", Software: Practice and Experience, Vol. 9, 4,
+ pp. 281-312, April 1979.
+
+ Modifications by Jose E. Marchesi:
+ - Use the simple POSIX-like transput provided by GCC.
+ - Read programs from lines rather than from cards.
+ - Add command-line option -l (listing).
+#
+
+BEGIN PROC itoa = (INT i) STRING:
+ BEGIN IF i = 0
+ THEN "0"
+ ELSE INT n := ABS i;
+ STRING res;
+ WHILE n /= 0
+ DO INT rem = n %* 10;
+ res := REPR (rem > 9 | (rem - 10) + ABS "a" | rem + ABS
"0") + res;
+ n %:= 10
+ OD;
+ (i < 0 | "-" + res | res)
+ FI
+ END;
+
+ CHAR sharp = REPR 35; # Sharp character,
+ to avoid confusing Emacs. #
+
+ # Input file. #
+ INT filein;
+
+ # IMPLEMENTATION RESTRICTIONS #
+ INT spoolsize = 400,
+ stlim = 50,
+ arglim = 5,
+ rslim = 80,
+ pslim = 20,
+ ftlim = 10;
+
+ # ABSTRACT MACHINE #
+ MODE ITEM = UNION (INT, REF STRINGITEM, PATTERN),
+ STRINGITEM = STRUCT (STRING val, REF ITEM ref),
+ PATTERN = REF[]COMPONENT,
+ COMPONENT = STRUCT (INT routine, subsequent, alternate, extra,
+ REF ITEM arg),
+ PSENTRY = STRUCT (INT cursor, alternate),
+ RSENTRY = REF ITEM,
+ FTENTRY = STRUCT (REF ITEM fnname, entry name,
+ REF[]REF ITEM params, locals);
+
+ [1:spoolsize] REF ITEM spool;
+ [1:pslim] PSENTRY pattern stack;
+ [1:rslim] RSENTRY run stack;
+ [1:ftlim] FTENTRY function table;
+
+ BOOL failed := FALSE;
+ INT nin, psp, rsp := 0, ftp := 0;
+ INT mstr = 1, mlen = 2, mbrk = 3, mspn = 4, many = 5, mnul = 6,
+ miv1 = 7, miv2 = 8, m1 = 9, mat = 10, mpos = 11, mtab = 12,
+ mrpos = 13, mrtab = 14, mnty = 15;
+
+ # INTERNAL FORM OF PROGRAMS #
+
+ MODE STMT = STRUCT (REF IDR label,
+ UNION (REF ASMT, REF MATCH,
+ REF REPL, REF EXPR) stmt core,
+ REF GOTOFIELD goto),
+ IDR = STRUCT (REF ITEM idr addr),
+ NUM = STRUCT (REF ITEM num addr),
+ LSTR = STRUCT (REF ITEM lstr addr),
+ ASMT = STRUCT (REF EXPR subject, object),
+ MATCH = STRUCT (REF EXPR subject, pattern),
+ REPL = STRUCT (REF EXPR subject, pattern, object),
+ EXPR = UNION (REF UNARYEXPR, REF BINARYEXPR, IDR, NUM,
+ LSTR, REF CALL),
+ GOTOFIELD = STRUCT (REF DEST upart, spart, fpart),
+ DEST = UNION (REF EXPR, CHAR),
+ UNARYEXPR = STRUCT (REF EXPR operand, CHAR operator),
+ BINARYEXPR = STRUCT (REF EXPR operand1, operand2,
+ CHAR operator),
+ CALL = STRUCT (IDR fnname, REF[]REF EXPR args);
+
+ REF[]STMT t;
+ REF ITEM prog entry := NIL;
+
+ PROC error = (STRING mess) VOID:
+ (puts ("error: " + mess + "'n"); stop);
+
+ # TRANSLATION PHASE #
+
+ BEGIN # DECLARATIONS FOR SCANNER #
+ STRING card, INT cp, # SOURCE LINE AND POINTER #
+ CHAR ch, # SOURCE CHARACTER #
+ [1:80]CHAR str, INT sp, # STRING BUFFER AND POINTER #
+ CHAR tok, # TOKEN CODE #
+ REF ITEM psn, # POSITION OF A CREATED VALUE #
+ INT nv, # NUMERIC VALUE OF CONSTANT #
+ INT stn, # SOURCE STATEMENT NUMBER #
+ BOOL listing, # FLAG FOR SOURCE LISTING #
+ CHAR c; # TEMPORARY #
+
+ # TOKEN MNEMONICS #
+ CHAR doll = "$", bdoll = "D",
+ plus = "+", bplus = "P",
+ minus = "-", bminus = "M",
+ at = "@", bbar = "!",
+ bstar = "*", bslash = "/",
+ lpar = "(", rpar = ")",
+ comma = ",", colon = ":",
+ equal = "=", blank = " ",
+ eos = ";", name = "A",
+ lstring = "L", number = "U",
+ endt = "E", ret = "R",
+ fret = "F", stok = "Y",
+ ftok = "Z";
+
+ PROC get card = VOID:
+ BEGIN cp := 0;
+ WHILE card := fgets (filein, 80);
+ IF UPB card = 0 THEN exit FI;
+ c := card[1];
+ IF c /= "." AND c /= "+" AND c /= "-" AND c /= "*"
+ THEN stn := stn + 1 FI;
+ IF listing THEN puts (itoa (stn) + " " + card +
"'n") FI;
+ IF c = "-"
+ THEN IF card[2:5] = "LIST"
+ THEN listing := TRUE
+ ELIF card[2:7] = "UNLIST"
+ THEN listing := FALSE
+ FI
+ FI;
+ c = "-" OR c = "*"
+ DO SKIP OD;
+ exit: SKIP
+ END;
+
+ PROC next ch = VOID:
+ IF cp = UPB card
+ THEN get card;
+ IF c = "." OR c = "+"
+ THEN ch := " "; cp := 1
+ ELSE ch := sharp # END OF LINE AND STATEMENT #
+ FI
+ ELSE ch := card[cp +:= 1]
+ FI;
+
+ PROC lookup = (STRING sv) REF ITEM : (
+ INT i := 0, BOOL nf := TRUE;
+ WHILE IF (i +:= 1) <= nin
+ THEN nf := sv /= val OF (spool[i] | (REF STRINGITEM s) :
s)
+ ELSE FALSE
+ FI
+ DO SKIP OD;
+ IF nf
+ THEN IF nin = spoolsize THEN error ("too many strings") FI;
+ spool[nin +:= 1] := HEAP ITEM := HEAP STRINGITEM :=
+ (sv, NIL)
+ FI;
+ spool[i]);
+
+ PROC scan = VOID:
+ IF ch = " " # BLANKS AND BINARY OPERATORS #
+ THEN WHILE next ch; ch = " " DO SKIP OD;
+ # IGNORE TRAILING BLANKS IN A STATEMENT #
+ IF ch = ";" THEN next ch; stn := stn + 1; tok := eos
+ ELIF ch = sharp THEN next ch; tok := eos
+ ELIF ch = "!" OR ch = "$" OR ch = "+" OR ch = "-"
+ OR ch = "*" OR ch = "/"
+ THEN IF card[cp+1] = " "
+ THEN c := ch;
+ WHILE next ch; ch = " " DO SKIP OD ;
+ tok := (c = "!" | bbar
+ |: c = "$" | bdoll
+ |: c = "-" | bminus
+ |: c = "+" | bplus
+ |: c = "*" | bstar
+ | bslash)
+ ELSE tok := blank
+ FI
+ ELSE tok := blank
+ FI
+ ELIF ch = "''" OR ch = """" # LITERAL STRINGS #
+ THEN c := ch; sp := 0;
+ WHILE next ch;
+ IF ch = sharp THEN error ("UNTERMINATED LITERAL") FI;
+ (str[sp +:= 1] := ch) /= c
+ DO SKIP OD ;
+ next ch;
+ tok := lstring;
+ IF sp = 1
+ THEN psn := NIL
+ ELSE STRING s = str[1:sp-1] ;
+ psn := lookup (s)
+ FI
+ ELIF ch >= "0" AND ch <= "9" # NUMBERS #
+ THEN nv := 0 ;
+ WHILE nv := nv * 10 + ABS ch - ABS "0";
+ next ch;
+ ch >= "0" AND ch <= "9"
+ DO SKIP OD ;
+ tok := number;
+ psn := HEAP ITEM := nv
+ ELIF ch >= "A" AND ch <= "Z" # NAMES #
+ THEN sp := 0;
+ WHILE str[sp +:= 1] := ch;
+ next ch;
+ ch = "." OR ch >= "A" AND ch <= "Z"
+ OR ch >= "0" AND ch <= "9"
+ DO SKIP OD ;
+ STRING s = str[1:sp];
+ tok := (s = "S" | stok
+ |: s = "F" | ftok
+ |: s = "END" | endt
+ |: s = "RETURN" | ret
+ |: s = "FRETURN" | fret
+ | psn := lookup (s); name)
+ ELIF ch = ";"
+ THEN next ch; stn := stn + 1; tok := eos
+ ELIF ch = sharp
+ THEN next ch; tok := eos
+ ELSE # ( ) , : = @ $ + - #
+ tok := ch; next ch
+ FI;
+
+ PROC init = VOID:
+ BEGIN stn := 0;
+ spool[nin := 1] := HEAP ITEM := HEAP STRINGITEM :=
+ ("ARB", HEAP ITEM := HEAP[1:3]COMPONENT :=
+ ((mnul, 2, 0, SKIP, NIL),
+ (mnul, 0, 3, SKIP, NIL),
+ (m1, 2, 0, SKIP, NIL)));
+ get card;
+ next ch;
+ scan
+ END;
+
+ PROC verify = (CHAR token) VOID:
+ IF tok = token THEN scan
+ ELSE STRING s := "TOKEN "" "" DOES NOT OCCUR WHERE EXPECTED";
+ s[8] := token;
+ error (s)
+ FI;
+
+ PROC translate = VOID:
+ BEGIN HEAP[1:stlim]STMT ss, INT ssc := 0;
+ WHILE IF ssc = stlim THEN error ("TOO MANY STATEMENTS") FI;
+ tok /= endt
+ DO ss[ssc +:= 1] := trans stmt OD;
+ scan;
+ IF tok = blank
+ THEN scan;
+ IF tok = name THEN prog entry := psn FI
+ FI;
+ t := ss[1:ssc]
+ END;
+
+ PROC trans stmt = STMT:
+ BEGIN
+ REF IDR lab := NIL;
+ REF EXPR subj, pat, obj := NIL;
+ REF GOTOFIELD go := NIL;
+ BOOL asgn;
+
+ PROC move to obj = STMT:
+ BEGIN
+ IF tok = blank
+ THEN scan;
+ IF tok = colon
+ THEN go := trans gofield
+ ELSE obj := trans expr;
+ IF tok = colon
+ THEN go := trans gofield
+ ELSE verify (eos)
+ FI
+ FI
+ ELSE verify (eos)
+ FI ;
+ IF asgn
+ THEN STMT (lab, HEAP ASMT := (subj, obj), go)
+ ELSE STMT (lab, HEAP REPL := (subj, pat, obj), go)
+ FI
+ END;
+
+ PROC move to subj = STMT:
+ BEGIN scan;
+ IF tok = colon
+ THEN STMT (lab, REF EXPR (NIL), trans gofield)
+ ELSE subj := trans elem;
+ IF tok = blank
+ THEN scan;
+ IF tok = colon
+ THEN STMT (lab, REF EXPR (subj), trans gofield)
+ ELIF tok = equal
+ THEN asgn := TRUE; scan; move to obj
+ ELSE pat := trans expr;
+ IF tok = colon
+ THEN STMT (lab, HEAP MATCH := (subj, pat),
trans gofield)
+ ELIF tok = equal
+ THEN asgn := FALSE; scan; move to obj
+ ELSE verify (eos);
+ STMT (lab, HEAP MATCH := (subj, pat),
NIL)
+ FI
+ FI
+ ELSE verify (eos);
+ STMT (lab, REF EXPR (subj), NIL)
+ FI
+ FI
+ END;
+
+ # Body of trans stmt. #
+ IF tok = name
+ THEN lab := HEAP IDR; idr addr OF lab := psn; scan;
+ IF tok = blank
+ THEN move to subj
+ ELSE verify (eos);
+ STMT (lab, REF EXPR (NIL), NIL)
+ FI
+ ELIF tok = blank
+ THEN move to subj
+ ELSE verify (eos);
+ STMT (lab, REF EXPR (NIL), NIL)
+ FI
+ END;
+
+ PROC trans gofield = REF GOTOFIELD:
+ BEGIN PROC where = REF DEST:
+ BEGIN HEAP DEST d;
+ verify (lpar);
+ IF tok = blank THEN scan FI;
+ d := (tok = endt | scan; "E"
+ |: tok = ret | scan; "R"
+ |: tok = fret | scan; "F"
+ | trans expr);
+ verify (rpar);
+ d
+ END;
+
+ REF DEST uncond := NIL, succ := NIL, fail := NIL;
+ scan; IF tok = blank THEN scan FI;
+ IF tok = stok
+ THEN scan; succ := where;
+ IF tok = blank THEN scan FI;
+ IF tok = ftok THEN scan; fail := where FI;
+ verify (eos)
+ ELIF tok = ftok
+ THEN scan; fail := where;
+ IF tok = blank THEN scan FI;
+ IF tok = stok THEN scan; succ := where FI;
+ verify (eos)
+ ELSE uncond := where; verify (eos)
+ FI;
+ HEAP GOTOFIELD := (uncond, succ, fail)
+ END;
+
+ PROC trans expr = REF EXPR:
+ BEGIN REF EXPR e := trans expr1;
+ WHILE tok = bbar
+ DO scan;
+ e := HEAP EXPR := HEAP BINARYEXPR := (e, trans expr1, "!")
+ OD;
+ e
+ END;
+
+ PROC trans expr1 = REF EXPR:
+ BEGIN REF EXPR e := trans expr2;
+ WHILE tok = blank
+ DO scan;
+ IF tok /= colon AND tok /= rpar AND tok /= comma AND tok
/= equal
+ THEN e := HEAP EXPR := HEAP BINARYEXPR := (e, trans
expr2, "C")
+ FI
+ OD;
+ e
+ END;
+
+ PROC trans expr2 = REF EXPR:
+ BEGIN REF EXPR e := trans term;
+ CHAR opr;
+ WHILE tok = bplus OR tok = bminus
+ DO opr := (tok = bplus | "+" | "-");
+ scan;
+ e := HEAP EXPR := HEAP BINARYEXPR := (e, trans term, opr)
+ OD;
+ e
+ END;
+
+ PROC trans term = REF EXPR:
+ BEGIN REF EXPR e := trans term1;
+ WHILE tok = bslash
+ DO scan;
+ e := HEAP EXPR := HEAP BINARYEXPR := (e, trans term1, "/")
+ OD;
+ e
+ END;
+
+ PROC trans term1 = REF EXPR:
+ BEGIN REF EXPR e := trans term2;
+ WHILE tok = bstar
+ DO scan;
+ e := HEAP EXPR := HEAP BINARYEXPR := (e, trans term2, "*")
+ OD;
+ e
+ END;
+
+ PROC trans term2 = REF EXPR:
+ BEGIN REF EXPR e := trans elem;
+ WHILE tok = bdoll
+ DO scan;
+ e := HEAP EXPR := HEAP BINARYEXPR := (e, trans elem, "$")
+ OD;
+ e
+ END;
+
+ PROC trans elem = REF EXPR:
+ IF tok = doll OR tok = plus OR tok = minus OR tok = at
+ THEN CHAR opr = tok;
+ scan;
+ HEAP EXPR := HEAP UNARYEXPR := (trans element, opr)
+ ELSE trans element
+ FI;
+
+ PROC trans element = REF EXPR:
+ IF tok = name
+ THEN IDR n;
+ idr addr OF n := psn;
+ scan;
+ IF tok /= lpar
+ THEN HEAP EXPR := n
+ ELSE HEAP[1:arglim]REF EXPR a, INT ac := 0;
+ WHILE scan;
+ IF tok = blank THEN scan FI;
+ IF ac = arglim
+ THEN error ("TOO MANY ARGUMENTS IN FUNCTION
CALL")
+ FI;
+ IF NOT (ac = 0 AND tok = rpar)
+ THEN a[ac +:= 1] := (tok = comma OR tok = rpar
| NIL | trans expr)
+ FI;
+ IF tok /= comma AND tok /= rpar
+ THEN error ("ERROR IN ARGUMENT LIST")
+ FI;
+ tok = comma
+ DO SKIP OD;
+ scan;
+ HEAP EXPR := HEAP CALL := (n, a[1:ac])
+ FI
+ ELIF tok = lstring
+ THEN LSTR ls;
+ lstr addr OF ls := psn;
+ scan;
+ HEAP EXPR := ls
+ ELIF tok = number
+ THEN NUM nu; num addr OF nu := psn;
+ scan;
+ HEAP EXPR := nu
+ ELSE verify (lpar);
+ IF tok = blank THEN scan FI;
+ REF EXPR e = trans expr;
+ verify (rpar);
+ e
+ FI;
+
+ PROC usage = VOID:
+ BEGIN puts ("Usage: snobol [-l] FILE'n");
+ stop
+ END;
+
+ listing := FALSE;
+ IF argc < 2 THEN usage FI;
+ FOR i FROM 2 TO argc
+ DO IF argv (i) = "-l" THEN listing := TRUE
+ ELIF filein = 0
+ THEN filein := fopen (argv (i), file o rdonly);
+ IF (filein = -1)
+ THEN error ("opening " + argv (i) + ": " + strerror
(errno)) FI
+ ELSE usage
+ FI
+ OD;
+ init;
+ translate
+ END; # TRANSLATION PHASE #
+
+ BEGIN # INTERPRETATION PHASE #
+
+ OP INTG = (REF ITEM a) INT: (a | (INT i) : i),
+ STR = (REF ITEM a) REF STRINGITEM: (a | (REF STRINGITEM s): s),
+ PAT = (REF ITEM a) PATTERN: (a | (PATTERN p) : p);
+ BOOL fn success;
+
+ PROC interpret = (INT stmt no) VOID:
+ BEGIN INT sn := stmt no; BOOL cycling := TRUE;
+
+ PROC jump = (REF DEST dest) VOID:
+ BEGIN failed := FALSE;
+ CASE dest
+ IN (REF EXPR e): sn := find label (eval softly (e)),
+ (CHAR c): IF c = "E" THEN sn := UPB t + 1
+ ELIF c = "R" THEN fn success := TRUE;
+ cycling := FALSE
+ ELSE # c = "F" # fn success := cycling :=
FALSE
+ FI
+ ESAC
+ END;
+
+ WHILE cycling
+ DO IF sn > UPB t THEN stop FI;
+ failed := FALSE;
+
+ # EXECUTE STATEMENT CORE #
+ CASE stmt core OF t[sn]
+ IN (REF ASMT a):
+ (REF ITEM sp = eval softly (subject OF a);
+ assign (sp, eval strongly (object OF a))),
+ (REF MATCH m):
+ (REF ITEM svp = eval strongly (subject OF m);
+ match (convert to str (svp),
+ convert to pat (eval strongly (pattern OF
m)))),
+ (REF REPL r):
+ (REF ITEM sp = eval softly (subject OF r);
+ REF ITEM pp = convert to pat (eval strongly
(pattern OF r));
+ REF ITEM svp = convert to str (ref OF (STR sp));
+ INT c = match (svp, pp);
+ REF ITEM b = (svp IS NIL | NIL | make str ((val OF
(STR svp))[c+1:]));
+ REF ITEM obp = eval strongly (object OF r);
+ assign (sp, concatenate (obp, b))),
+ (REF EXPR e):
+ eval strongly (e)
+ ESAC;
+
+ # PROCESS GOTO FIELD #
+ REF GOTOFIELD go = goto OF t[sn];
+ IF go IS NIL THEN sn := sn + 1
+ ELIF REF DEST (upart OF go) ISNT NIL
+ THEN jump (upart OF go)
+ ELIF NOT failed AND (REF DEST (spart OF go) ISNT NIL)
+ THEN jump (spart OF go)
+ ELIF failed AND (REF DEST (fpart OF go) ISNT NIL)
+ THEN jump (fpart OF go)
+ ELSE sn := sn + 1
+ FI
+ OD
+ END; # END OF INTERPRET #
+
+ PROC find label = (REF ITEM label ptr) INT:
+ BEGIN INT stmt no := 0;
+ IF failed THEN error ("FAILURE IN GOTO FIELD") FI;
+ FOR i TO UPB t WHILE stmt no = 0
+ DO IF (REF IDR (label OF t[i]) IS NIL
+ | FALSE
+ | label ptr IS idr addr OF label OF t[i])
+ THEN stmt no := i
+ FI
+ OD;
+ IF stmt no = 0 THEN error ("UNDEFINED LABEL") FI;
+ stmt no
+ END;
+
+ PROC match = (REF ITEM subject ptr, pattern ptr) INT:
+ IF failed
+ THEN 0
+ ELSE PATTERN p = PAT pattern ptr;
+ STRING subj = (subject ptr IS NIL | "" | val OF (STR
subject ptr));
+ INT u = UPB subj;
+ INT iarg, # INTEGER COMPONENT ARGUMENT #
+ STRING sarg, # STRING COMPONENT ARGUMENT #
+ INT l; # LENGTH OF SARG #
+ INT cn := 1, # COMPONENT NUMBER #
+ c := 0, # CURSOR #
+ code; # NEW CURSOR OR -1 IF COMPONENT NO-MATCH #
+ BOOL matching := TRUE;
+
+ psp := 0; # CLEAR PATTERN STACK #
+ WHILE matching
+ DO IF alternate OF p[cn] /= 0
+ THEN # PUSH PATTERN STACK #
+ pattern stack[psp +:= 1] := (c, alternate OF p[cn])
+ FI;
+ IF REF ITEM (arg OF p[cn]) ISNT NIL
+ THEN CASE arg OF p[cn]
+ IN (INT i) : iarg := i,
+ (REF STRINGITEM s):
+ (sarg := val OF s; l := UPB sarg)
+ ESAC
+ FI;
+
+ # EXECUTE INDICATED MATCHING ROUTINE #
+ CASE routine OF p[cn]
+ IN # MSTR #
+ IF REF ITEM (arg OF p[cn]) IS NIL
+ THEN code := c
+ ELIF c + l > u THEN code := -1
+ ELSE code := (sarg = subj[c+1:c+l] | c + l | -1)
+ FI,
+ # MLEN #
+ code := (iarg <= u - c | c + iarg | -1),
+ # MBRK #
+ IF c >= u THEN code := -1
+ ELSE INT n = break scan (subj[c+1:], sarg);
+ code := (n < u - c | c + n | -1)
+ FI,
+ # MSPN #
+ IF c >= u THEN code := -1
+ ELIF any (sarg, subj[c+1])
+ THEN INT j := c + 1;
+ FOR i FROM c + 2 TO u WHILE any (sarg, subj[i])
+ DO j := i OD;
+ code := j
+ ELSE code := -1
+ FI,
+ # MANY #
+ IF c >= u
+ THEN code := -1
+ ELSE code := (any (sarg, subj[c+1]) | c + 1 | -1)
+ FI,
+ # MNUL #
+ code := c,
+ # MIV1 #
+ code := extra OF p[cn] := c,
+ # MIV2 #
+ (INT m = extra OF p[cn - extra OF p[cn]] + 1;
+ assign (arg OF p[cn], make str (subj[m:c]));
+ code := c),
+ # M1 #
+ code := (1 <= u - c | c + 1 | -1),
+ # MAT #
+ (assign (arg OF p[cn], make int (c));
+ code := c),
+ # MPOS #
+ code := (c = iarg | c | -1),
+ # MTAB #
+ code := (c <= iarg AND iarg <= u | iarg | -1),
+ # MRPOS #
+ code := (u - c = iarg | c | -1),
+ # MRTAB #
+ code := (u - c >= iarg | u - iarg | -1),
+ # MNTY #
+ IF c >= u
+ THEN code := -1
+ ELSE code := (any (sarg, subj[c+1]) | -1 | c + 1)
+ FI
+ ESAC;
+
+ # DECIDE WHAT TO DO NEXT #
+ IF code >= 0
+ THEN IF subsequent OF p[cn] = 0
+ THEN matching := FALSE #SUCCESSFUL TERMINATION #
+ ELSE cn := subsequent OF p[cn];
+ c := code # CONTINUE #
+ FI
+ ELIF psp = 0
+ THEN failed := TRUE;
+ matching := FALSE # STMT FAILURE #
+ ELSE # POP PATTERN STACK TO BACKTRACK #
+ cn := alternate OF pattern stack[psp];
+ c := cursor OF pattern stack[psp];
+ psp := psp - 1
+ FI
+ OD;
+ (failed | 0 | code)
+ FI; # END OF MATCH PROCEDURE #
+
+ PROC assign = (REF ITEM subject ptr, object ptr) VOID:
+ IF failed THEN SKIP
+ ELSE REF STRINGITEM s = STR subject ptr;
+ ref OF s := object ptr;
+ IF val OF s = "OUTPUT"
+ THEN IF object ptr IS NIL
+ THEN puts ("'n")
+ ELSE CASE object ptr
+ IN (REF STRINGITEM r): puts ((val OF r) + "'n"),
+ (INT i): puts (itoa (i) + "'n"),
+ (PATTERN): (error ("ATTEMPT TO OUTPUT
PATTERN"); SKIP)
+ ESAC
+ FI
+ FI
+ FI;
+
+ PROC eval softly = (REF EXPR expression) REF ITEM:
+ IF failed THEN SKIP
+ ELSE CASE expression # CAN NEVER BE NIL #
+ IN (IDR id): idr addr OF id,
+ (REF UNARYEXPR ue):
+ IF operator OF ue = "$"
+ THEN REF ITEM r = convert to str (eval strongly
(operand OF ue));
+ IF r IS NIL
+ THEN error ("NULL RESULT WHERE VAR REQUIRED");
+ SKIP
+ ELSE r
+ FI
+ ELSE error ("INAPPROPRIATE UNARY EXPR WHERE VAR
REQUIRED");
+ SKIP
+ FI
+ OUT error ("INAPPROPRIATE EXPR WHERE VAR REQUIRED");
+ SKIP
+ ESAC
+ FI;
+
+ PROC eval strongly = (REF EXPR expression) REF ITEM:
+ IF failed THEN SKIP
+ ELIF expression IS NIL THEN NIL
+ ELSE CASE expression
+ IN (IDR id):
+ (REF STRINGITEM s = STR (idr addr OF id);
+ IF val OF s = "INPUT"
+ THEN STRING line;
+ # SNOBOL programs read data from stdin. #
+ line := gets (80);
+ IF (line = "") THEN failed := TRUE; eof FI;
+ assign (idr addr OF id, make str (line));
+ eof: SKIP
+ FI;
+ ref OF s),
+ (NUM nbr):
+ num addr OF nbr,
+ (LSTR ls):
+ lstr addr OF ls,
+ (REF UNARYEXPR ue):
+ (REF ITEM arg ptr = (operator OF ue = "@"
+ | eval softly (operand OF ue)
+ | eval strongly (operand OF
ue));
+ eval unary (arg ptr, operator OF ue)),
+ (REF BINARYEXPR be):
+ (REF ITEM arg1 ptr = eval strongly (operand1 OF be);
+ REF ITEM arg2 ptr = (operator OF be = "$"
+ | eval softly (operand2 OF be)
+ | eval strongly (operand2 OF
be));
+ eval binary (arg1 ptr, arg2 ptr, operator OF be)),
+ (REF CALL cl):
+ (INT n = UPB args OF cl;
+ [1:n]REF ITEM arglist;
+ FOR i TO n
+ DO arglist[i] := eval strongly ((args OF cl)[i]) OD;
+ eval call (idr addr OF fnname OF cl, arglist))
+ ESAC
+ FI;
+
+ PROC eval unary = (REF ITEM arg ptr, CHAR opr) REF ITEM:
+ IF failed THEN SKIP
+ ELSE IF opr = "$"
+ THEN IF arg ptr IS NIL
+ THEN error ("INDIRECTION APPLIED TO NULL STRING");
+ SKIP
+ ELSE ref OF (STR convert to str (arg ptr))
+ FI
+ ELIF opr = "+"
+ THEN convert to int (arg ptr)
+ ELIF opr = "-"
+ THEN INT k = INTG convert to int (arg ptr);
+ make int (-k)
+ ELSE # OPR = "@" #
+ make pat comp (mat, arg ptr)
+ FI
+ FI;
+
+ PROC eval binary = (REF ITEM arg1 ptr, arg2 ptr, CHAR opr) REF
ITEM:
+ IF failed THEN SKIP
+ ELSE IF opr = "$"
+ THEN REF ITEM c = concatenate (make pat comp (miv1, NIL),
+ arg1 ptr);
+ concatenate (c, make pat comp (miv2, arg2 ptr))
+ ELIF opr = "*" OR opr = "/" OR opr = "+" OR opr = "-"
+ THEN INT m = INTG convert to int (arg1 ptr),
+ n = INTG convert to int (arg2 ptr);
+ make int ((opr = "*" | m * n
+ |: opr = "/" | m OVER n
+ |: opr = "+" | m + n | m - n))
+ ELIF opr = "C"
+ THEN concatenate (arg1 ptr, arg2 ptr)
+ ELSE # OPR = "!" #
+ PATTERN p1 = PAT convert to pat (arg1 ptr),
+ p2 = PAT convert to pat (arg2 ptr);
+ INT u1 = UPB p1, u2 = UPB p2;
+ PATTERN p = HEAP[u1 + u2]COMPONENT,
+ INT offset = u1 + 1, INT j := 1;
+ p[1:u1] := p1[1:u1];
+ WHILE alternate OF p[j] /= 0
+ DO j := alternate OF p[j] OD;
+ alternate OF p[j] := offset;
+ FOR i FROM offset TO u1 + u2
+ DO p[i] := p2 [i - u1];
+ IF subsequent OF p[i] /= 0
+ THEN subsequent OF p[i] +:= u1
+ FI;
+ IF alternate OF p[i] /= 0
+ THEN alternate OF p[i] +:= u1
+ FI
+ OD;
+ HEAP ITEM := p
+ FI
+ FI;
+
+ PROC eval call = (REF ITEM name ptr, REF[]REF ITEM arglist) REF
ITEM:
+ IF failed THEN SKIP
+ ELSE # SEARCH FUNCTION TABLE FOR NAME #
+ BOOL not found := TRUE, INT j;
+ FOR i TO ftp WHILE not found
+ DO IF name ptr IS fnname OF function table[i]
+ THEN j := i; not found := FALSE
+ FI
+ OD;
+ IF not found
+ THEN exec prim fn (name ptr, arglist)
+ ELSE #PROGRAMMER-DEFINED FUNCTION #
+
+ PROC stack = (REF ITEM a) VOID:
+ (IF rsp = rslim THEN error ("RUN STACK OVERFLOW")
FI;
+ run stack [rsp +:= 1] := a);
+
+ PROC unstack = REF ITEM:
+ (IF rsp = 0 THEN error ("RETURN FROM LEVEL 0") FI;
+ run stack [(rsp -:= 1) + 1]);
+
+ REF STRINGITEM name = STR name ptr;
+
+ # ENTRY PROTOCOL #
+ stack (ref OF name);
+ assign (name ptr, NIL);
+ REF[]REF ITEM params = params OF function table[j],
+ INT n = UPB arglist;
+ IF UPB params /= n
+ THEN error ("WRONG NUMBER OF ARGUMENTS IN CALL")
+ FI;
+ FOR i TO n
+ DO stack (ref OF (STR params[i]));
+ assign (params[i], arglist[i])
+ OD;
+ REF[]REF ITEM locals = locals OF function table[j];
+ FOR i TO UPB locals
+ DO stack (ref OF (STR locals[i]));
+ assign (locals[i], NIL)
+ OD;
+
+ interpret (find label (entry name OF function
table[j]));
+
+ # RETURN PROTOCOL #
+ FOR i FROM UPB locals BY -1 TO 1
+ DO assign (locals[i], unstack) OD;
+ FOR i FROM n BY -1 TO 1
+ DO assign (params[i], unstack) OD;
+ REF ITEM result = ref OF name;
+ assign (name ptr, unstack);
+ (fn success | result | failed := TRUE ; SKIP)
+ FI
+ FI;
+
+ PROC exec prim fn = (REF ITEM name ptr,
+ REF[]REF ITEM arglist) REF ITEM:
+ BEGIN
+ PROC gen1 = (INT routine) REF ITEM:
+ BEGIN # CREATE PATTERN COMPONENT WITH STRING ARGUMENT #
+ REF ITEM arg = convert to str (arglist[1]);
+ IF arg IS NIL
+ THEN error ("NULL ARG FOR PATTERN-VALUED PRIMITIVE
FUNCTION" )
+ FI;
+ make pat comp (routine, arg)
+ END;
+
+ PROC gen2 = (INT routine) REF ITEM:
+ BEGIN # CREATE PATTERN COMPONENT WITH INTEGER ARGUMENT #
+ REF ITEM arg = convert to int (arglist[1]);
+ IF INTG arg < 0
+ THEN error ("NEGATIVE ARG FOR PATTERN-VALUED PRIMITIVE
FUNCTION")
+ FI;
+ make pat comp (routine, arg)
+ END;
+
+ STRING fn = val OF (STR name ptr), INT n = UPB arglist;
+ IF fn = "LE" AND n = 2
+ THEN IF INTG convert to int (arglist[1])
+ <= INTG convert to int (arglist[2])
+ THEN NIL
+ ELSE failed := TRUE;
+ SKIP
+ FI
+ ELIF fn = "EQ" AND n = 2
+ THEN IF INTG convert to int (arglist[1])
+ = INTG convert to int (arglist[2])
+ THEN NIL
+ ELSE failed := TRUE;
+ SKIP
+ FI
+ ELIF fn = "NE" AND n = 2
+ THEN IF INTG convert to int (arglist[1])
+ /= INTG convert to int (arglist[2])
+ THEN NIL
+ ELSE failed := TRUE;
+ SKIP
+ FI
+ ELIF fn = "IDENT" AND n = 2
+ THEN IF REF ITEM (arglist[1]) IS arglist[2]
+ THEN NIL
+ ELSE failed := TRUE;
+ SKIP
+ FI
+ ELIF fn = "DIFFER" AND n = 2
+ THEN IF REF ITEM (arglist[1]) ISNT arglist[2]
+ THEN NIL
+ ELSE failed := TRUE;
+ SKIP
+ FI
+ ELIF fn = "ANY" AND n = 1 THEN gen1 (many)
+ ELIF fn = "LEN" AND n = 1 THEN gen2 (mlen)
+ ELIF fn = "POS" AND n = 1 THEN gen2 (mpos)
+ ELIF fn = "TAB" AND n = 1 THEN gen2 (mtab)
+ ELIF fn = "SPAN" AND n = 1 THEN gen1 (mspn)
+ ELIF fn = "RPOS" AND n = 1 THEN gen2 (mrpos)
+ ELIF fn = "RTAB" AND n = 1 THEN gen2 (mrtab)
+ ELIF fn = "BREAK" AND n = 1 THEN gen1 (mbrk)
+ ELIF fn = "NOTANY" AND n = 1 THEN gen1 (mnty)
+ ELIF fn = "SIZE" AND n = 1
+ THEN make int (UPB val OF (STR convert to str (arglist[1])))
+ ELIF fn = "DEFINE" AND n = 2
+ THEN IF REF ITEM (arglist[1]) IS NIL
+ THEN error ("NULL PROTOTYPE") FI;
+ STRING prototype = val OF (STR convert to str
(arglist[1]));
+ REF ITEM entry = convert to str (arglist[2]);
+ IF entry IS NIL THEN error ("NULL ENTRY LABEL") FI;
+
+ PROC check and find = (STRING str) REF ITEM:
+ BEGIN IF UPB str = 0 THEN error ("ILLEGAL PROTOTYPE")
FI;
+ STRING an =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.";
+ IF NOT any (an[:26], str[1])
+ THEN error ("ILLEGAL PROTOTYPE") FI;
+ FOR i FROM 2 TO UPB str
+ DO IF NOT any (an, str[i])
+ THEN error ("ILLEGAL PROTOTYPE")
+ FI
+ OD;
+ make str (str)
+ END;
+
+ PROC breakup = (STRING str) REF[]REF ITEM:
+ BEGIN #ANALYZE A LIST OF IDENTIFIERS #
+ [1:arglim]REF ITEM r, INT p := 0, a := 1, b;
+ WHILE a <= UPB str
+ DO b := break scan (str[a:], ",");
+ IF p >= arglim
+ THEN error ("TOO MANY PARAMETERS OR LOCALS IN
PROTOTYPE") FI;
+ r[p +:= 1] := check and find (str[a:a+b-1]);
+ a := a + b + 1
+ OD;
+ HEAP[1:p]REF ITEM := r[:p]
+ END;
+
+ INT lp = UPB prototype;
+ INT a = break scan (prototype, "(");
+ IF a >= lp THEN error ("ILLEGAL PROTOTYPE") FI;
+ REF ITEM name ptr = check and find (prototype[:a]);
+ INT b = break scan (prototype[a+2:], ")");
+ IF b >= lp - a - 1 THEN error ("ILLEGAL PROTOTYPE") FI;
+ REF[]REF ITEM params = breakup (prototype[a+2:a+1+b]);
+ REF[]REF ITEM locals = breakup (prototype[a+b+3:]);
+
+ BOOL not found := TRUE;
+ FOR i TO ftp WHILE not found
+ DO IF name ptr IS fnname OF function table[i]
+ THEN not found := FALSE;
+ function table[i] := (name ptr, entry, params,
locals)
+ FI
+ OD;
+ IF not found
+ THEN IF ftp = ftlim
+ THEN error ("FUNCTION TABLE OVERFLOW") FI;
+ function table [ftp +:= 1] := (name ptr, entry,
params, locals)
+ FI;
+ NIL # RESULT OF DEFINE(...) #
+ ELSE error ("ILLEGAL FUNCTION CALL");
+ SKIP
+ FI
+ END;
+
+ PROC concatenate = (REF ITEM ptr1, ptr2) REF ITEM:
+ BEGIN
+
+ PROC concat patterns = (PATTERN p1, p2) REF ITEM:
+ BEGIN INT u1 = UPB p1, u2 = UPB p2;
+ PATTERN p = HEAP[u1 + u2]COMPONENT;
+ INT offset = u1 + 1;
+ FOR i TO u1
+ DO p[i] := p1[i];
+ IF subsequent OF p[i] = 0
+ THEN subsequent OF p[i] := offset FI
+ OD;
+ FOR i FROM offset TO u1 + u2
+ DO p[i] := p2[i - u1];
+ IF subsequent OF p[i] /= 0
+ THEN subsequent OF p[i] +:= u1 FI;
+ IF alternate OF p[i] /= 0
+ THEN alternate OF p[i] +:= u1 FI
+ OD;
+ IF u2 = 1 AND routine OF p[offset] = miv2
+ THEN extra OF p[offset] := u1 FI;
+ HEAP ITEM := p
+ END;
+
+ IF failed THEN SKIP
+ ELSE IF ptr1 IS NIL THEN ptr2
+ ELIF ptr2 IS NIL THEN ptr1
+ ELSE CASE ptr1
+ IN (PATTERN p1):
+ concat patterns (p1, PAT convert to pat (ptr2))
+ OUSE ptr2
+ IN (PATTERN p2):
+ concat patterns (PAT convert to pat (ptr1), p2)
+ OUT STRING s1 = val OF (STR convert to str (ptr1));
+ make str (s1 + val OF (STR convert to str
(ptr2)))
+ ESAC
+ FI
+ FI
+ END;
+
+ PROC convert to int = (REF ITEM ptr) REF ITEM:
+ IF failed THEN SKIP
+ ELSE IF ptr IS NIL THEN make int (0)
+ ELSE CASE ptr
+ IN (INT): ptr,
+ (PATTERN): (error ("PATTERN VALUE WHERE INTEGER
REQUIRED"); SKIP),
+ (REF STRINGITEM s):
+ (INT n := 0, d, z := ABS "0";
+ FOR i TO UPB val OF s
+ DO d := ABS (val OF s)[i] - z;
+ IF d < 0 OR d > 9
+ THEN error ("STRING NOT CONVERTIBLE TO
INTEGER") FI;
+ n := n * 10 + d
+ OD;
+ make int (n))
+ ESAC
+ FI
+ FI;
+
+ PROC convert to pat = (REF ITEM ptr) REF ITEM:
+ IF failed THEN SKIP
+ ELSE IF ptr IS NIL
+ THEN make pat comp (mstr, NIL)
+ ELSE CASE ptr
+ IN (PATTERN): ptr
+ OUT make pat comp (mstr, convert to str (ptr))
+ ESAC
+ FI
+ FI;
+
+ PROC convert to str = (REF ITEM ptr) REF ITEM:
+ IF failed THEN SKIP
+ ELSE IF ptr IS NIL THEN ptr
+ ELSE CASE ptr
+ IN (REF STRINGITEM): ptr,
+ (PATTERN): (error ("PATTERN VALUE WHERE STRING
REQUIRED"); SKIP),
+ (INT i): make str (itoa (i))
+ ESAC
+ FI
+ FI;
+
+ PROC make int = (INT val) REF ITEM:
+ IF failed THEN SKIP
+ ELSE HEAP ITEM := val
+ FI;
+
+ PROC make pat comp = (INT routine, REF ITEM arg) REF ITEM:
+ IF failed THEN SKIP
+ ELSE HEAP ITEM := HEAP[1:1]COMPONENT := COMPONENT (routine, 0,
0, SKIP, arg)
+ FI;
+
+ PROC make str = (STRING val) REF ITEM:
+ IF failed THEN SKIP
+ ELIF UPB val = 0 THEN NIL
+ ELSE INT i := 0, BOOL nf := TRUE;
+ WHILE IF (i +:= 1) <= nin
+ THEN nf := val /= val OF (STR spool [i])
+ ELSE FALSE
+ FI
+ DO SKIP OD;
+ IF nf
+ THEN IF nin = spoolsize THEN error ("TOO MANY STRINGS") FI;
+ spool[nin +:= 1] := HEAP ITEM := HEAP STRINGITEM :=
(val, NIL)
+ FI;
+ spool[i]
+ FI;
+
+ PROC break scan = (STRING str, arg) INT:
+ BEGIN # RESULT = UPB STR IF NO BREAK CHAR, LESS OTHERWISE #
+ INT j := 0;
+ FOR i TO UPB str WHILE NOT any (arg, str[i])
+ DO j := i OD;
+ j
+ END;
+
+ PROC any = (STRING str, CHAR ch) BOOL:
+ BEGIN BOOL nf;
+ FOR i TO UPB str WHILE nf := ch /= str[i] DO SKIP OD;
+ NOT nf
+ END;
+
+ interpret ((REF ITEM (prog entry) IS NIL | 1 | find label (prog
entry)))
+ END # INTERPRETATION PHASE #
+END
diff --git a/gcc/testsuite/algol68/compile/supper-1.a68
b/gcc/testsuite/algol68/compile/supper-1.a68
new file mode 100644
index 00000000000..a572f1e929f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-1.a68
@@ -0,0 +1,11 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode Some_Mode = real;
+ Some_Mode some_real := random;
+
+ puts ("Hello time for SUPPER!\n");
+ if some_real > 0.5
+ then puts ("YES\n")
+ else puts ("NO\n")
+ fi
+end
diff --git a/gcc/testsuite/algol68/compile/supper-10.a68
b/gcc/testsuite/algol68/compile/supper-10.a68
new file mode 100644
index 00000000000..5c661a677f4
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-10.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode BEGIN = int;
+ BEGIN some_int = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-11.a68
b/gcc/testsuite/algol68/compile/supper-11.a68
new file mode 100644
index 00000000000..5c661a677f4
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-11.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode BEGIN = int;
+ BEGIN some_int = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-12.a68
b/gcc/testsuite/algol68/compile/supper-12.a68
new file mode 100644
index 00000000000..497a88a2e66
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-12.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin for i while i < 10
+ do puts ("lala\n")
+ od
+end
diff --git a/gcc/testsuite/algol68/compile/supper-13.a68
b/gcc/testsuite/algol68/compile/supper-13.a68
new file mode 100644
index 00000000000..5e17fb4832c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-13.a68
@@ -0,0 +1,7 @@
+{ dg-options "-fstropping=supper" }
+
+{ mode_ should not be recognized as a symbol. }
+
+begin int mode_ = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-2.a68
b/gcc/testsuite/algol68/compile/supper-2.a68
new file mode 100644
index 00000000000..04d5f0f461f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-2.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin int foo_bar = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-3.a68
b/gcc/testsuite/algol68/compile/supper-3.a68
new file mode 100644
index 00000000000..4cc711b9132
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-3.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin int foo_bar_ = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-4.a68
b/gcc/testsuite/algol68/compile/supper-4.a68
new file mode 100644
index 00000000000..283be9a4735
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-4.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin int foo_ = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-5.a68
b/gcc/testsuite/algol68/compile/supper-5.a68
new file mode 100644
index 00000000000..b3ffd899e5c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-5.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode Foo_bar = int;
+ Foo_bar some_int = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-6.a68
b/gcc/testsuite/algol68/compile/supper-6.a68
new file mode 100644
index 00000000000..37fc5e6f3c2
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-6.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin go to done;
+done: skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-7.a68
b/gcc/testsuite/algol68/compile/supper-7.a68
new file mode 100644
index 00000000000..a3741748b4c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-7.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+
+begin goto done;
+done: skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-8.a68
b/gcc/testsuite/algol68/compile/supper-8.a68
new file mode 100644
index 00000000000..363d9b483ca
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-8.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode Int = int;
+ Int some_int = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/supper-9.a68
b/gcc/testsuite/algol68/compile/supper-9.a68
new file mode 100644
index 00000000000..5c661a677f4
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/supper-9.a68
@@ -0,0 +1,6 @@
+{ dg-options {-fstropping=supper} }
+
+begin mode BEGIN = int;
+ BEGIN some_int = 10;
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/uniting-1.a68
b/gcc/testsuite/algol68/compile/uniting-1.a68
new file mode 100644
index 00000000000..057c4f85838
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/uniting-1.a68
@@ -0,0 +1,8 @@
+{ dg-options {-fstropping=supper} }
+begin mode JSON_Val = union (int,ref JSON_Obj),
+ JSON_Obj = struct (int je),
+
+ proc json_new_obj = JSON_Val:
+ (JSON_Obj o; o);
+ skip
+end
diff --git a/gcc/testsuite/algol68/compile/upper-1.a68
b/gcc/testsuite/algol68/compile/upper-1.a68
new file mode 100644
index 00000000000..6fb7871301f
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/upper-1.a68
@@ -0,0 +1,11 @@
+# { dg-options {-fstropping=upper} } #
+
+BEGIN MODE SOME_MODE = REAL;
+ SOME_MODE some_real := random;
+
+ puts ("Hello time for SUPPER!\n");
+ IF some_real > 0.5
+ THEN puts ("YES\n")
+ ELSE puts ("NO\n")
+ FI
+END
diff --git a/gcc/testsuite/algol68/compile/warning-scope-1.a68
b/gcc/testsuite/algol68/compile/warning-scope-1.a68
new file mode 100644
index 00000000000..99ae973fe90
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-1.a68
@@ -0,0 +1,9 @@
+# { dg-options "-fstropping=upper" } #
+
+# Potential scope violation warnings are disabled by default. #
+BEGIN PROC increase = (REF INT i) REF INT:
+ BEGIN INT j := i;
+ j # Inhibited warning. #
+ END;
+ increase (LOC INT)
+END
diff --git a/gcc/testsuite/algol68/compile/warning-scope-2.a68
b/gcc/testsuite/algol68/compile/warning-scope-2.a68
new file mode 100644
index 00000000000..5bbc0b37126
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-2.a68
@@ -0,0 +1,8 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+BEGIN PROC increase = (REF INT i) REF INT:
+ BEGIN
+ INT j := i;
+ j # { dg-warning "scope violation" } #
+ END;
+ increase (LOC INT)
+END
diff --git a/gcc/testsuite/algol68/compile/warning-scope-3.a68
b/gcc/testsuite/algol68/compile/warning-scope-3.a68
new file mode 100644
index 00000000000..c5dd29562c0
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-3.a68
@@ -0,0 +1,3 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+(REF INT xx;
+ xx := (INT x; x := 3)) # { dg-warning "scope violation" } #
diff --git a/gcc/testsuite/algol68/compile/warning-scope-4.a68
b/gcc/testsuite/algol68/compile/warning-scope-4.a68
new file mode 100644
index 00000000000..ae0592ed743
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-4.a68
@@ -0,0 +1,3 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+(REF INT xx;
+ (INT x; xx:= x; x := 3)) # { dg-warning "scope violation" } #
diff --git a/gcc/testsuite/algol68/compile/warning-scope-5.a68
b/gcc/testsuite/algol68/compile/warning-scope-5.a68
new file mode 100644
index 00000000000..2bb5b4afe88
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-5.a68
@@ -0,0 +1,8 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+# The scope violation here is due to the routine text, which is copied
+ to P, referring to a value whose range doesn't exist anymore: X #
+BEGIN (PROC REAL p;
+ (REAL x;
+ p := REAL: x * 2); # { dg-warning "scope violation" } #
+ p)
+END
diff --git a/gcc/testsuite/algol68/compile/warning-scope-6.a68
b/gcc/testsuite/algol68/compile/warning-scope-6.a68
new file mode 100644
index 00000000000..fa3888d6528
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-6.a68
@@ -0,0 +1,6 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+BEGIN (PROC REAL p; REAL mypi := 3.14;
+ (REAL x;
+ p := REAL: mypi * 2); # No scope violation here. #
+ p)
+END
diff --git a/gcc/testsuite/algol68/compile/warning-scope-7.a68
b/gcc/testsuite/algol68/compile/warning-scope-7.a68
new file mode 100644
index 00000000000..b99fa85ddff
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-scope-7.a68
@@ -0,0 +1,12 @@
+# { dg-options {-Wscope -fstropping=upper} } #
+# N,M below represent pairs of insc, outsc #
+BEGIN (INT x;
+ REF INT xx;
+ (REF INT yy;
+ INT y;
+ xx := yy; # 0,0 := 1,0. Dynamic check. #
+ yy := y; # 1,1 := 1,1. OK #
+ xx := y # 0,0 := 1,1. { dg-warning "scope violation" } #
+ )
+ )
+END
diff --git a/gcc/testsuite/algol68/compile/warning-voiding-1.a68
b/gcc/testsuite/algol68/compile/warning-voiding-1.a68
new file mode 100644
index 00000000000..f34787c2979
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-voiding-1.a68
@@ -0,0 +1,5 @@
+# { dg-options {-Wvoiding -fstropping=upper} } #
+BEGIN PROC sum = (INT a, INT b) INT:
+ ( a + b );
+ sum (10, 20) # { dg-warning "will be voided" } #
+END
diff --git a/gcc/testsuite/algol68/compile/warning-voiding-2.a68
b/gcc/testsuite/algol68/compile/warning-voiding-2.a68
new file mode 100644
index 00000000000..e3c98792c91
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/warning-voiding-2.a68
@@ -0,0 +1,6 @@
+# { dg-options "-fstropping=upper" } #
+
+BEGIN PROC sum = (INT a, INT b) INT:
+ ( a + b );
+ sum (10, 20) # Voiding warning won't be emitted by default. #
+END
--
2.30.2