[m-rev.] diff: 20.06 release preparations

Julien Fischer jfischer at opturion.com
Tue Jun 2 16:22:44 AEST 2020


20.06 release preparations.

NEWS:
HISTORY:
     Shift 20.01.X NEWS into the HISTORY file.

RELEASE_NOTES:
     Bump version.

Julien.

diff --git a/HISTORY b/HISTORY
index 4e3de68..20bde99 100644
--- a/HISTORY
+++ b/HISTORY
@@ -4695,6 +4695,1376 @@ Changes to the extras distribution:
    trail from Mercury code.


+NEWS for Mercury 20.01.2, 3 May 2020
+====================================
+
+This is a bug-fix release.
+
+* We have a fixed bug that prevented the runtime from building correctly
+  in C grades on 32-bit platforms when *not* using GCC as the C compiler.
+
+* [Mantis bug #461]. We have fixed an assertion failure affecting programs
+  in low-level C parallel grades as they exit.
+
+
+NEWS for Mercury 20.01.1, 1 March 2020
+======================================
+
+This is a bug-fix release.
+
+* We have added a new option `--warn-suspicious-recursion` that asks the
+  compiler to warn about recursive calls which are likely to have problems,
+  such as leading to infinite recursion. (This feature was present in the
+  20.01 release but not announced.)
+
+* We now allow combined higher-order types and insts as direct arguments of
+  functors in discriminated unions, as in the following type:
+
+        :- type job
+            --->    job(pred(int::out, io::di, io::uo) is det).
+
+  For any construction unification using this functor the argument must have
+  the required higher-order inst; it is a mode error if it does not. When
+  terms of type `job` with inst `ground` are deconstructed, the argument is
+  inferred to have the given inst, allowing a higher-order call in that mode.
+  (This feature was present in the 20.01 release but not announced.)
+
+* [Mantis bug #496]. The compiler now emits a reminder about the limitation
+  of common subexpression elimination in the presence of uniqueness when
+  this is a possible cause of determinism errors.
+
+  As of version 20.01, common subexpression elimination does not transform
+
+         (
+             X = f(A1, ..., An),
+             goal A
+         ;
+             X = f(B1, ..., Bn),
+             goal B
+         )
+
+  into
+
+         X = f(X1, ..., Xn),
+         (
+             A1 = X1, ..., An = Xn,
+             goal A
+         ;
+             B1 = X1, ..., Bn = Xn,
+             goal B
+         )
+
+  when the insts of some of the arguments of `X` are at least partially unique.
+  This is because the current mode analysis cannot track uniqueness through
+  the extra unifications that this transformation introduces.
+
+
+NEWS for Mercury 20.01, 28 January 2020
+=======================================
+
+Changes to the core libraries license
+-------------------------------------
+
+* We have modified the terms under which the Mercury core libraries are
+  licensed by adding an exception to the requirements of clause 6 for
+  executable files linked against the Mercury core libraries.
+
+  See the file COPYING.LIB for the terms of the Mercury core library
+  license.
+
+  See the file LICENSE for licensing information in general.
+
+  The licensing of the compiler and other parts of the system has **not**
+  been changed.
+
+Changes that may break compatibility
+------------------------------------
+
+* When the Mercury compiler looks at code using Mercury keywords (such as
+  `"func"` and `"pred"`) and Mercury operators (such as the clause neck
+  operator `":-"`) but which cannot be parsed as the Mercury constructs
+  that those Mercury keywords and operators are part of, it now generates
+  a specific error message for each discrepancy. In the past, when it found
+  such code, the compiler considered such code to construct terms and/or
+  to call functions and predicates. Usually, the terms did not belong to
+  any declared type and the called functions and predicates did not exist,
+  leading to confusing error messages from the compiler.
+
+  The compiler's new approach generates considerably better diagnostics,
+  but it does mean that code that uses Mercury's keywords and/or operators
+  in ways that are inconsistent with Mercury's own uses of those keywords
+  and operators will not compile anymore. Such code will need to be changed,
+  typically by changing the names of some function symbols, functions
+  or predicates.
+
+* Code that switches on a field of a term could previously written directly as
+
+        (
+            Term ^ field = value1,
+            ...
+        ;
+            Term ^ field = value2,
+            ...
+        )
+
+    The compiler would then internally rearrange this as
+
+        Field = Term ^ field,
+        (
+            Field = value1,
+            ...
+        ;
+            Field = value2,
+            ...
+        )
+
+    and then recognize this as a switch on `Field`.
+
+    However, it turns out that while this transformation is valid
+    in the vast majority of cases (well in excess of 99%), it is not valid
+    in some rare circumstances involving terms with unique arguments.
+    This means that the current version of the compiler is not allowed
+    to do the above transformation automatically, so programmers must
+    perform it themselves if needed.
+
+* We have enabled stricter checking of non-ground final insts to reject more
+  mode-incorrect code. Due to compiler limitations, some code that should be
+  accepted will now be rejected. They will require modifications to appease
+  the compiler. [Mantis bugs #86, #117, #191].
+
+* We have enabled stricter checking of the requirement that a type, inst
+  or a mode that is *not* exported from a module may not be used in the
+  declarations of entities (such as predicates and typeclasses) that *is*
+  exported from that module. This may require the explicit export of e.g.
+  some types that previously were not exported.
+
+* We have enabled stricter checking of type declarations and definitions:
+  all declarations and definitions of a type must agree on whether the type
+  is a solver type or not, and the definitions (as opposed to the names)
+  of solver types may not be exported from their defining module.
+
+* We have enabled stricter checking of module accessibility rules.
+  If a module `m` has an `import_module` or `use_module` declaration for
+  module `x.y.z`, it must also have `import_module` or `use_module`
+  declarations for its ancestors `x` and `x.y`. And if the import or use
+  of `x.y.z` is in module `m`'s interface, then the import or use of `x.y.z`'s
+  ancestor modules must also be in the interface.
+
+* The compiler now requires that, in projects that do not build
+  a `Mercury.modules` file using e.g. `mmc -f *.m`, submodules must be stored
+  in files whose name is the fully qualified module name followed by `.m`.
+  (This means that e.g. a module named `a.b.c` must be in a file named
+  `a.b.c.m`.) The reason for this change is that without it, the compiler
+  cannot tell whether a file named e.g. `lexer.m` contains the Mercury
+  standard library module `lexer`, or a submodule of a user-written
+  parent module. [Mantis bug #489].
+
+* The `:- module` declaration in a separate submodule now must contain the
+  fully qualified module name.
+
+* References to everything imported via `:- use_module` declarations
+  must now be fully module qualified.
+
+* `for` is now an operator. (See the extension of the syntax of inst
+  declarations below.)
+
+* It is now an error for a program to redefine a builtin type. The affected
+  type names are:
+
+        int
+        int{8,16,32,64}
+        uint
+        uint{8,16,32,64}
+        float
+        character
+        string
+        {}
+        =
+        pred
+        func
+        pure
+        semipure
+        impure
+        ''
+
+* It is now an error for a program to redefine a builtin inst. The affected
+  inst names are:
+
+        =<
+        any
+        bound
+        bound_unique
+        clobbered
+        clobbered_any
+        free
+        ground
+        is
+        mostly_clobbered
+        mostly_unique
+        mostly_unique_any
+        not_reached
+        unique
+        unique_any
+
+* It is now an error for a program to redefine a builtin mode. The affected
+  mode names are:
+
+        =
+        >>
+        any_func
+        any_pred
+        func
+        is
+        pred
+
+* We have deleted the builtin inst synonyms `old` and `new`: their uses
+  should be replaced with `any` and `free` respectively.
+
+* We have deleted the builtin modes `no` and `oo`: their uses should be
+  replaced with `oa` and `ia` respectively.
+
+* The minimum version of the Java platform required by Mercury's Java
+  backend is now Java SE 8.
+
+* The representation of integer constants in the standard library's `term`
+  and `lexer` modules has been generalised. The base, signedness and size of
+  each integer constant is now recorded. Furthermore, these modules now use
+  arbitrary-precision integers to represent the values of integer constants.
+
+  Code that relies on the old representation of integer constants used by
+  the `term` or `lexer` modules may use the `old_term_parser` library in the
+  extras instead.
+
+* We have changed the semantics of `int.(<<)` and `int.(>>)` so that they throw
+  an exception if their second operand is not in [0, bits_per_int). For now,
+  the old behaviour of these operations is provided by the functions
+  `int.legacy_left_shift/2` and `int.legacy_right_shift/2`. These functions
+  will be deleted in a future release.
+
+* We have changed the semantics of `int.abs/1` so that it throws an exception
+  if its argument is equal to `int.min_int`. The old behaviour of this function
+  is provided by the new function `int.unchecked_abs/1`.
+
+* We have changed the semantics of `array.map_corresponding_foldl/6` so that it
+  throws an exception if the input arrays differ in size.
+
+* We have changed the semantics of `array.shrink/3` and `array.resize/4`
+  so that they throw an exception if their first argument is negative.
+
+* We have changed the semantics of `array.fetch_items/4` so that it always
+  throws an exception if its second or third argument is out of bounds.
+  Previously, it would return an empty if list if its third argument was less
+  than the second even if one, or both, of these arguments was out of bounds.
+
+* We have removed the `io.poly_type` equivalence type from the `io` module.
+  `string.poly_type` should be used directly. This may require an explicit
+  import of the `string` module.
+
+* The predicates and functions in the `term` module that provide conversion
+  from arbitrary types to terms and vice versa have been moved to their own
+  module, `term_conversion`. See the changes to the `term` module below for
+  a list of affected predicates and functions.
+
+* We have removed legacy support for the following systems:
+
+    - IRIX
+    - OSF/1
+
+* The following compilation grades are no longer supported:
+
+    - asm_jump*
+    - jump*
+    - hl_nest*
+    - hlc_nest*
+    - il*
+
+Changes to the Mercury language
+-------------------------------
+
+* We have added nine new primitive types: `uint`, `int8`, `int16`, `int32`,
+  `int64`, `uint8`, `uint16`, `uint32` and `uint64`. The type `uint` is an
+  unsigned integer type of the same size as Mercury's `int` type; the types
+  `int8`, `int16`, `int32` and `int64` are signed integer types of width
+  8, 16, 32 and 64 bits respectively; the types `uint8`, `uint16`, `uint32`
+  and `uint64` are unsigned integer types of width 8, 16, 32 and 64 bits
+  respectively.
+
+    Literals of these new types must have a distinguishing suffix, for example:
+
+        999u
+        561i32
+        0b1111100111i64
+        0o16u8
+        0x3e732i64
+
+    Basic operations on the new primitive types are provided by the
+    new standard library modules: `uint`, `int8`, `uint8`, `int16`, `uint16`,
+    `int32`, `uint32` `int64`, and `uint64`.
+
+* We have added a new kind of scope to the language: determinism checks
+  for switch arms. These scopes are introduced by any of the new keywords
+
+        require_switch_arms_det
+        require_switch_arms_semidet
+        require_switch_arms_multi
+        require_switch_arms_nondet
+        require_switch_arms_cc_multi
+        require_switch_arms_cc_nondet
+        require_switch_arms_erroneous
+        require_switch_arms_failure
+
+    `require_switch_arms_<determinism> [Var] Goal` tells the compiler
+    to require `Goal` to be a switch on `Var` in which all the switch arms
+    have determinisms at least as tight as `<determinism>`, and to generate
+    error messages for any violations of this requirement.
+
+* We have changed the meaning of `require_complete_switch` scopes slightly:
+  the compiler now generates an error if the goal inside the scope
+  is not a switch on the named variable.
+
+* We have added a new kind of scope to the language for disabling warnings
+  within the scope. A goal such as
+
+        disable_warnings [singleton_vars] (
+           Goal
+        )
+
+    is equivalent to `Goal`, with the exception that the compiler will not
+    generate warnings about singleton variables inside `Goal`.
+
+* We have extended the syntax of `:- inst` declarations to allow programmers
+  to specify which type constructor's values the inst is meant for.
+  The syntax consists of adding `for`, followed by the type constructor's
+  name and arity, between the name of the inst and its definition, like this:
+
+        :- inst listskel(Inst) for list/1
+            --->    []
+            ;       [Inst | listskel(Inst)].
+
+  For the time being, this is useful only as a documentation of the
+  programmer's intention; the compiler does not (yet) prevent the use of insts
+  on values of types other than the one they were declared to be for.
+
+* We have added an extension to include external files
+  in `pragma foreign_decl` and `pragma foreign_code` declarations.
+
+* We have added a foreign type assertion `word_aligned_pointer` that
+  allows the Mercury implementation to avoid boxing values of the foreign type
+  that the assertion is for when the type appears as the sole argument
+  of a data constructor.
+
+* We have added a new pragma named `consider_used`. This pragma tells
+  the compiler to consider the predicate or function it names to be used,
+  preventing it from generating unused procedure warnings either for
+  any of its procedures, or for any of the procedures they call,
+  directly or indirectly.
+
+* We have added an optional second field to the `obsolete` pragma.
+  When present, it may contain a list of the names and arities of
+  predicates and/or functions that programmers should consider using
+  instead of the obsolete predicate or function.
+
+* We have added an `obsolete_proc` pragma. While the `obsolete` pragma
+  declares all modes of a predicate or function to be obsolete, the
+  `obsolete_proc` pragma declares only one mode of a predicate or function
+  to be obsolete. Like the updated version of the `obsolete` pragma,
+  the `obsolete_proc` pragma may have a second argument naming one or more
+  suggested replacements.
+
+* The Java backend now supports defining foreign types as primitive Java
+  types.
+
+* Digits in numeric literals may now be separated by underscores in order
+  to improve readability.
+
+Changes to the Mercury standard library
+---------------------------------------
+
+### New Integer Modules
+
+* We have added the new modules `uint`, `int8`, `uint8`, `int16`, `uint16`,
+  `int32`, `uint32`, `int64` and `uint64`. These modules provide
+  the basic operations on the new integer types.
+
+  Many other standard library modules now have additional predicates
+  that support the new integer types; see the entries for those modules
+  for details.
+
+### New Random Number Generator Framework
+
+* We have added a new type class based interface to random number generators
+  to the `random` module. The new interface provides predicates for:
+
+    - generating pseudo-random integers that are uniformly distributed
+      in a range.
+    - generating pseudo-random floats that are uniformly distributed
+      in a range.
+    - generating pseudo-random floats from a normal (i.e. Gaussian)
+      distribution.
+    - generating a random permutation of an array.
+    - generating a random permutation of a list.
+
+  Three new submodules, `random.sfc16`, `random.sfc32` and `random.sfc64`,
+  provide instances of the new type classes. Further instances can be found
+  in the extras distribution (see below).
+
+### New Module: `diet`
+
+* This module provides discrete interval encoding trees, which are a highly
+  efficient set implementation for fat sets. This module is a contribution
+  from Yes Logic Pty. Ltd.
+
+### New Module: `edit_seq`
+
+* This module provides operations for computing and manipulating edit
+  sequences. Given two sequences of items, an edit sequence is the shortest
+  sequence of edit operations (deletes, inserts and/or replaces) that will
+  transform the first sequence into the second.
+
+### New Module: `psqueue`
+
+* This module implements a priority search queue ADT. This is a blend between
+  a priority queue and a map. This was contributed by Matthias Güdemann.
+
+### New Module: `ranges`
+
+* This module represents sets of integers using sorted lists of ranges. This
+  module exports operations that make it particularly suitable for representing
+  domains in finite domain constraint solvers.
+
+### New Module: `term_conversion`
+
+* This module provides generic operations for the conversion of values of
+  arbitrary types to and from terms. These operations were previously
+  provided by the `term` module.
+
+  See the list of changes to the `term` module below.
+
+### New Module: `thread.barrier`
+
+* This module provides the `barrier/0` type. This type can be used to control
+  progress in concurrent code. This module was contributed by
+  Mission Critical IT.
+
+### New Module: `thread.future`
+
+* This module provides the `future/0` and `future_io/0` types. These type can
+  be used to compute values in parallel using other threads. This module was
+  contributed by Mission Critical IT.
+
+### Changes to the `array` module
+
+* The following functions and predicates have been added:
+
+    - `det_least_index/1`
+    - `semidet_least_index/1`
+    - `det_greatest_index/1`
+    - `semidet_greatest_index/1`
+    - `foldl_corresponding/5`
+    - `foldl2_corresponding/7`
+    - `fill/3`
+    - `fill_range/5`
+    - `swap/4`
+    - `unsafe_swap/4`
+
+* The following functions have been deprecated and will be removed in a future
+  release:
+
+    - `least_index/1`
+    - `greatest_index/1`
+
+### Changes to the `array2d` module
+
+* The following functions and predicates have been added:
+
+    - `is_empty/1`
+    - `fill/3`
+    - `from_array/3`
+
+### Changes to the `assoc_list` module
+
+* The following predicate has been added:
+
+    - `svremove/4`
+
+* `svremove/4` is like `remove/4` but its arguments are in an order
+  more conducive to the use of state variable notation.
+
+### Changes to the `bag` module
+
+* The following functions and predicates have been added:
+
+    - `singleton/1`
+    - `insert_duplicates/4`
+    - `det_insert_duplicates/4`
+    - `det_insert_duplicates/3`
+
+* The following predicate and function have been deprecated and will be
+  remove in a future release.
+
+    - `to_set_without_duplicates/2`
+    - `to_set_without_duplicates/1`
+
+### Changes to the `bitmap` module
+
+* The following predicates and functions have been added:
+
+    - `is_empty/1`
+    - `det_from_string/1`
+    - `get_uint8/1`, `unsafe_get_uint8/1`
+    - `set_uint8/4`, `unsafe_set_uint8/4`
+
+### Changes to the `builtin` module
+
+* The following predicate and function have been deprecated and will be removed
+  in a future release:
+
+    - `promise_only_solution/1`
+    - `promise_only_solution_io/4`
+
+  Existing code that uses either of these should be replaced with code that
+  uses a `promise_equivalent_solutions` goal instead.
+
+* The following modes have been deprecated and will be removed in a future
+  release:
+
+    - `input/0`
+    - `output/0`
+
+  Existing code that uses these modes should replace their use with `in`
+  or `out` respectively.
+
+### Changes to the `calendar` module
+
+* The following functions and predicates have been added:
+
+    - `int_to_month/2`
+    - `det_int_to_month/1`
+    - `int0_to_month/2`
+    - `det_int0_to_month/1`
+    - `month_to_int/1`
+    - `month_to_int0/1`
+    - `same_date/1`
+
+### Changes to the `char` module
+
+* The following predicates and functions have been added:
+
+    - `is_ascii/1`
+    - `is_decimal_digit/1`
+    - `is_base_digit/2`
+    - `int_to_binary_digit/2`, `det_int_to_binary_digit/1`
+    - `int_to_octal_digit/2`, `det_int_to_octal_digit/1`
+    - `int_to_decimal_digit/2`, `det_int_to_decimal_digit/1`
+    - `int_to_hex_digit/2`, `det_int_to_hex_digit/1`
+    - `base_int_to_digit/3`, `det_base_int_to_digit/2`
+    - `binary_digit_to_int/2`, `det_binary_digit_to_int/1`
+    - `octal_digit_to_int/2`, `det_octal_digit_to_int/1`
+    - `decimal_digit_to_int/2`, `det_decimal_digit_to_int/1`
+    - `hex_digit_to_int/2`, `det_hex_digit_to_int/1`
+    - `base_digit_to_int/3`, `det_base_digit_to_int/2`
+    - `is_leading_surrogate/1`, `is_trailing_surrogate/1`
+    - `is_control/1`, `is_space_separator/1`, `is_paragraph_separator/1`
+    - `is_line_separator/1`, `is_private_use/1`
+
+* The following predicates have been deprecated and will either be removed or
+  have their semantics changed in a future release:
+
+    - `is_hex_digit/2`
+    - `int_to_hex_char/2`
+    - `digit_to_int/2`
+    - `int_to_digit/2`
+    - `det_int_to_digit/1`, `det_int_to_digit/2`
+
+  NOTE: existing code that calls `digit_to_int/2` assuming that it will
+  only succeed for decimal digits (0-9) may be broken.
+
+### Changes to the `cord` module
+
+* The following predicates and functions have been added:
+
+    - `to_list/1`     (synonym for the existing `list/1` function)
+    - `to_rev_list/1` (synonym for the existing `rev_list/1` function)
+    - `rev_cord_list_to_cord/1` (similar to `cord_list_to_cord/1`)
+    - `rev_cord_list_to_list/1` (similar to `cord_list_to_list/1`)
+    - `cons/3`
+    - `snoc/3`
+    - `find_first_match/3`
+
+### Changes to the `deconstruct` module
+
+* The predicate `functor/4` has been modified so that for character and string
+  data, any control characters in the functor representation are escaped.
+
+### Changes to the `digraph` module
+
+* The following predicates and functions have been added:
+
+    - `return_vertices_in_from_to_order/2`
+    - `return_vertices_in_to_from_order/2`
+    - `return_sccs_in_from_to_order/1`
+    - `return_sccs_in_to_from_order/1`
+
+### Changes to the `float` module
+
+* The following predicates and function have been added:
+
+    - `is_finite/1`
+    - `is_zero/1`
+    - `is_infinite/1`        (synonym for the existing `is_inf/1` predicate)
+    - `is_nan_or_infinite/1` (synonym for the existing `is_nan_or_inf/1` predicate)
+    - `infinity/0`
+
+### Changes to the `getopt` and `getopt_io` modules
+
+* We have added variants of the `process_options` predicates that return errors
+  using a type instead of strings. A new function, `option_error_to_string/1`,
+  can be used to convert values of the new error type into strings.
+
+### Changes to the `hash_table` module
+
+* The following predicates have been added:
+
+    - `fold2/6`
+    - `fold3/8`
+
+### Changes to the `int` module
+
+* The following predicates and functions have been added:
+
+    - `all_true_in_range/3`
+    - `unchecked_abs/1`
+    - `nabs/1`
+
+* The following predicate has been deprecated:
+
+    - `is/2`
+
+### Changes to the `integer` module
+
+* The following predicates and functions have been added:
+
+    - `from_string/2`
+    - `from_base_string/3`
+    - `to_int/2`
+    - `det_to_int/1`
+    - `to_base_string/2`
+    - `negative_one/0`, `two/0`, `ten/0`
+    - `is_zero/1`
+    - `to_uint/2`
+    - `det_to_uint/1`
+    - `from_uint/1`
+    - `to_int{8,16,32,64}/2`
+    - `det_to_int{8,16,32,64}/1`
+    - `from_int{8,16,32,64}/1`
+    - `to_uint{8,16,32,64}/2`
+    - `det_to_uint{8,16,32,64}/1`
+    - `from_uint{8,16,32,64}/1`
+
+* The following functions have been deprecated and will be removed in a
+  future release:
+
+    - `from_string/1`
+    - `from_base_string/2`
+    - `int/1`
+
+### Changes to the `io` module
+
+* The following predicates have been added:
+
+    - `write_uint/3`, `write_uint/4`
+    - `write_int{8,16,32,64}/3`, `write_int{8,16,32,64}/4`
+    - `write_uint{8,16,32,64}/3`, `write_uint{8,16,32,64}/4`
+    - `write_binary_int8/3`, `write_binary_int8/4`
+    - `write_binary_uint8/3`, `write_binary_uint8/4`
+    - `write_binary_int{16,32,64}/3`, `write_binary_int{16,32,64}/4`
+    - `write_binary_int{16,32,64}_{le,be}/3`, `write_binary_int{16,32,64}_{le,be}/4`
+    - `read_binary_int8/[34]`
+    - `read_binary_uint8/[34]`
+    - `putback_int8/[34]`
+    - `putback_uint8/[34]`
+    - `read_binary_int{16,32,64}/3`, `read_binary_int{16,32,64}/4`
+    - `read_binary_int{16,32,64}_{le,be}/3`, `read_binary_int{16,32,64}_{le,be}/4`
+    - `read_binary_uint{16,32,64}/3`, `read_binary_uint{16,32,64}/4`
+    - `read_binary_uint{16,32,64}_{le,be}/3`, `read_binary_uint{16,32,64}_{le,be}/4`
+    - `read_line_as_string_and_num_code_units/[34]`
+    - `print_line/[34]`, `write_line/[34]`
+    - `write_array/[56]` (similar to `write_list` but for arrays)
+    - `temp_directory/3`
+    - `make_temp_directory/3`
+    - `make_temp_directory/5`
+    - `set_environment_var/5`
+    - `have_set_environment_var/0`
+    - `seek_binary_input64/5`, `seek_binary_output64/5`
+    - `binary_input_stream_offset64/4`, `binary_output_stream_offset64/4`
+
+* The `print_line` and `write_line` family of predicates behave like the
+  `print` and `write` predicates, but also write a terminating newline.
+
+* `print` now outputs arbitrary precision integers in their decimal form
+   instead of printing their underlying representation.
+
+* The predicate `set_environment_var/5` returns an `io.res` value rather than
+  throwing an exception. The predicate `have_set_environment_var/0` can test
+  whether the current platform supports the ability to set environment
+  variables.
+
+* We have made the following predicates exception safe: the current input or
+  output stream is restored to the original stream if an exception is thrown
+  during their execution:
+
+     - `read/4`
+     - `write_list/6`
+     - `write_array/6`
+     - `read_binary/4`
+     - `write_binary/4`
+
+### Changes to the `lexer` module
+
+* We have added predicates that read from an explicitly specified input stream,
+  not from the current input stream.
+
+### Changes to the `list` module
+
+* The following predicates and functions have been added:
+
+    - `any_true/2`
+    - `any_false/2`
+    - `reverse_prepend/2`
+    - `reverse_prepend/3`
+    - `take_while/4`
+    - `take_while/3`
+    - `take_while/2`
+    - `drop_while/3`
+    - `drop_while/2`
+    - `one_or_more_to_list/1`
+    - `list_to_one_or_more/2`
+    - `list_to_one_or_more_det/2`
+
+* The following predicate has been deprecated and will be remove in a future
+  release:
+
+    - `takewhile/4` (use `take_while/4` instead)
+
+* The `take/3` and `drop/3` predicates have been modified so that they fail if
+  their first argument is less than zero.
+
+* The `split_upto/4` and `take_upto/3` predicates and `take_upto/2` function
+  have been modified so that they throw an exception if their first argument
+  is negative.
+
+### Changes to the `map` module
+
+* The following predicates have been added:
+
+    - `foldl5/12`
+    - `foldr5/12`
+    - `map_foldl4/11`
+    - `intersect_list/4`
+    - `union_list/4`
+    - `select_unselect/4`
+    - `select_unselect_sorted_list/4`
+
+### Changes to the `math` module
+
+* The following function and predicate have been added:
+
+    - `fma/3`
+    - `have_fma/0`
+
+* `fma/3` provides the fused multiply-add operation on platforms that
+  support that operation. The predicate `have_fma/0` may be used to check for
+  this support.
+
+### Changes to the `maybe` module
+
+* We have a added a new type, `maybe_errors`, to the `maybe` module.
+
+* The following predicate and function have been added:
+
+    - `fold2_maybe/6`
+    - `maybe_default/2`
+    - `pred_to_maybe/1`
+    - `func_to_maybe/1`
+
+### Changes to the `parser` module
+
+* We have added predicates that read from an explicitly specified input stream,
+  not from the current input stream.
+
+### Changes to the `pretty_printer` module
+
+* The type `formatter_limit` has been renamed to `func_symbol_limit`, since
+  this better reflects the type's purpose.
+
+* We have replaced the `set_formatter` function with a predicate of the same
+  name, since this allows the use of state variable notation when
+  setting up more than one type-specific formatter,
+
+* We have renamed the `write_doc_to_stream` predicate as `put_doc`, to better
+  fit in with the names other predicates that operate on values of the
+  `stream.writer` typeclass, and changed its interface to group
+  the prettyprinter parameters together in a value of the type
+  that was designed for this purpose.
+
+### Changes to the `random` module.
+
+* The existing random number generator defined in this module has been
+  deprecated in favour of the type class based random number generation
+  framework described above.
+
+  As such, the `supply/0` type and the following predicates have been
+  deprecated and will be deleted in a future release:
+
+    - `init/2`
+    - `random/3`
+    - `random/5`
+    - `randmax/3`
+    - `randcount/3`
+    - `permutation/4`
+
+### Changes to the `rbtree` module
+
+* The following predicates have been added:
+
+    - `foldl_values/4`
+    - `foldl2_values/6`
+
+### Changes to the `require` module
+
+* The following predicate and function have been added:
+
+    - `error/2`
+    - `func_error/2`
+
+### Changes to the `set` module
+
+* The following predicates and/or functions have been added:
+
+    - `intersection_and_differences/5`
+    - `det_remove/3`
+    - `det_remove_list/3`
+    - `rev_sorted_list_to_set/[12]`
+
+* The following predicate and/or functions have been deprecated:
+
+    - `empty/1`
+    - `non_empty/1`
+    - `set/1`
+
+    Similar changes have been made to the other set implementations
+    in the library.
+
+### Changes to the `std_util` module
+
+* The following functions have been deprecated:
+
+    - `maybe_pred/3`
+    - `maybe_func/2`
+
+### Changes to the `stream.string_writer` module
+
+* The following predicates have been added:
+
+    - `put_uint/4`
+    - `put_int{8,16,32,64}/4`
+    - `put_uint{8,16,32,64}/4`
+
+* `print` now outputs arbitrary precision integers in their decimal form
+  instead of printing their underlying representation.
+
+### Changes to the `string` module
+
+* Predicates and functions in this module now have defined behaviours
+  for strings containing ill-formed sequences. Also, some predicates and
+  functions now have defined behaviour on surrogate code points
+  (e.g. failing or throwing an exception) that was previously undefined.
+
+* The following predicates have been added:
+
+    - `is_all_alnum/1`
+    - `is_empty/1`
+    - `is_well_formed/1`
+    - `from_code_unit_list_allow_ill_formed/2`
+    - `to_utf8_code_unit_list/2`
+    - `to_utf16_code_unit_list/2`
+    - `from_utf8_code_unit_list/2`
+    - `from_utf16_code_unit_list/2`
+    - `det_remove_prefix/3`
+    - `compare_ignore_case_ascii/3`
+    - `to_rev_char_list/2`
+    - `compare_substrings/6`
+    - `unsafe_compare_substrings/6`
+    - `nondet_append/3`
+    - `append_string_pieces/2`
+    - `unsafe_append_string_pieces/2`
+    - `unsafe_sub_string_search_start/4`
+    - `index_next_repl/5`
+    - `unsafe_index_next_repl/5`
+    - `prev_index_repl/5`
+    - `unsafe_prev_index_repl/5`
+    - `uint_to_string/1`
+    - `int{8,16,32,64}_to_string/1`
+    - `uint{8,16,32,64}_to_string/1`
+
+* The following procedures have been deprecated:
+
+    - `to_char_list(uo, in)`
+    - `to_rev_char_list(uo, in)`
+    - `from_char_list(out, in)`
+    - `append(out, out, in)`
+    - `prefix(in, out)`
+    - `suffix(in, out)`
+
+* The following obsolete predicates and functions have been removed:
+
+    - `substring/3`
+    - `substring/4`
+    - `unsafe_substring/3`
+    - `unsafe_substring/4`
+    - `foldl_substring/5`
+    - `foldl_substring/6`
+    - `foldl2_substring/8`
+    - `foldl2_substring/8`
+    - `foldr_substring/5`
+    - `foldr_substring/6`
+
+* We have reduced the memory allocated by `to_lower` and `to_upper`.
+
+* `string_to_doc/1` now escapes characters in its input argument with
+  backslash escapes when required.
+
+* [Mantis bug #348]. Float special values, NaNs and Infinities, are now
+  converted to strings in a way that is backend- and grade-independent.
+
+* [Mantis bug #376]. `base_digit_to_int/3` and `det_base_digit_to_int/2` now
+  check for overflow and underflow in all bases, not only base 10.
+
+### Changes to the `store` module
+
+* Procedures in this module no longer acquire the global lock.
+
+### Changes to the `term` module
+
+* The following predicates and functions have been added:
+
+    - `dummy_context_init/0`
+    - `is_dummy_context/1`
+    - `term_to_int/2`
+    - `term_to_uint/2`
+    - `term_to_int{8,16,32,64}/2`
+    - `term_to_uint{8,16,32,64}/2`
+    - `decimal_term_to_int/2`
+    - `int_to_decimal_term/2`
+    - `int{8,16,32,64}_to_decimal_term/2`
+    - `uint_to_decimal_term/2`
+    - `uint{8,16,32,64}_to_decimal_term/2`
+    - `rename_var_in_term/4`
+    - `rename_vars_in_terms/4`
+    - `apply_renaming_in_term/3`
+    - `apply_renaming_in_terms/3`
+    - `apply_renaming_in_var/3`
+    - `apply_renaming_in_vars/3`
+    - `apply_renaming_in_term/3`
+    - `apply_renaming_in_terms/3`
+    - `substitute_var_in_term/4`
+    - `substitute_var_in_terms/4`
+    - `substitute_corresponding_in_term/4`
+    - `substitute_corresponding_in_terms/4`
+    - `apply_substitution_in_term/3`
+    - `apply_substitution_in_terms/3`
+    - `apply_rec_substitution_in_term/3`
+    - `apply_rec_substitution_in_terms/3`
+
+* The following predicates and functions have been moved to the
+  `term_conversion` module:
+
+   - `try_term_to_type/[12]`
+   - `term_to_type/2`
+   - `det_term_to_type/[12]`
+   - `type_to_term/[12]`
+   - `univ_to_term/[12]`
+
+* The following predicates and functions have been deprecated and will be
+  removed in a future release:
+
+   - `var_id/1`
+   - `relabel_variable/[34]`
+   - `relabel_variables/[34]`
+   - `rename/[34]`
+   - `rename_list/[34]`
+   - `apply_renaming/[23]`
+   - `apply_renaming_to_list/[23]`
+   - `apply_variable_renaming_to_var/[23]`
+   - `apply_variable_renaming_to_vars/[23]`
+   - `apply_variable_renaming/[23]`
+   - `apply_variable_renaming_to_list/[23]`
+   - `substitute/[34]`
+   - `substitute_list/[34]`
+   - `substitute_corresponding/[34]`
+   - `substitute_corresponding_list/[34]`
+   - `apply_substitution/[23]`
+   - `apply_substitution_to_list/[23]`
+   - `apply_rec_substitution/[23]`
+   - `apply_rec_substitution_to_list/[23]`
+
+### Changes to the `thread` module
+
+* The following predicates have been added:
+
+    - `spawn_native/4`
+    - `spawn/4`
+    - `num_processors/3`
+
+* `spawn_native/4` allows you to dedicate an OS thread to a Mercury thread.
+
+* `num_processors/3` returns the number of processors available for
+  parallel work.
+
+### Changes to the `thread.mvar` module
+
+* The following predicates and functions have been added:
+
+    - `impure_init/1`
+    - `try_read/4`
+
+* The following function has been deprecated and will be removed in a
+  future release:
+
+    - `init/1`
+
+### Changes to the `thread.semaphore` module
+
+* The following predicate has been deprecated and will be removed in a
+  future release:
+
+     - `init/1`
+
+### Changes to the `time` module
+
+* The following predicates have been added:
+
+    - `localtime/4`
+    - `mktime/4`
+
+* The following functions have been deprecated and will be removed in a
+  future release:
+
+    - `localtime/1`
+    - `mktime/1`
+    - `ctime/1`
+
+### Changes to the `tree234` module
+
+* The following predicate has been added:
+
+    - `map_foldl4/11`
+
+### Changes to the `version_array` module
+
+* The following function has been added:
+
+    - `from_reverse_list/1`
+
+Changes to the Mercury compiler
+-------------------------------
+
+### New warning options
+
+* `--inform-incomplete-switch`, `--inform-incomplete-switch-threshold N`
+
+   This option asks the compiler to generate an informational message for
+   switches that do not cover all of the function symbols that the switched-on
+   variable could be bound to.
+
+   The option `--inform-incomplete-switch-threshold N` can be used to restrict
+   the generation of these messages to only switches that *do* cover at least
+   *N* percent of the function symbols that the switched-on variable
+   could be bound to.
+
+* `--inhibit-style-warnings`
+
+  This option asks the compiler not to generate any warnings that are purely
+  about programming style, and do not point out code that is reasonably
+  likely to be wrong.
+
+* `--no-warn-accumulator-swaps`
+
+  We have renamed the `--inhibit-accumulator-warnings` option to
+  `--no-warn-accumulator-swaps`.
+
+* `--warn-dead-preds`
+
+  While the existing option `--warn-dead-procs` asks the compiler to generate
+  warnings for every unused procedure of the module being compiled, this new
+  option asks the compiler to generate a warning for a predicate or function
+  only if none of its procedures is used.
+
+* `--warn-implicit-stream-calls`
+
+  This option asks the compiler to generate a warning for every call to a
+  predicate `p/N` if there is also a predicate `p/(N+1)` which differs from
+  `p/N` only in that it has additional argument at the front of its argument
+  list that specifies an I/O stream. This is intended to generate warnings for
+  calls to predicates such as `io.write_string/3`, which writes to the current
+  output stream, to encourage programmers to call `io.write_string/4` instead.
+  If the option is given, the compiler will also generate warnings for calls
+  to predicates such as `io.see`, `io.seen`, `io.tell` and `io.told`, which
+  set the current input or output streams respectively.
+
+* `--warn-inconsistent-pred-order-clauses`, `--warn-inconsistent-pred-order-foreign-procs`
+
+  Both of these options ask the compiler to generate a warning if, among
+  either (a) the set of exported predicates and functions of the module,
+  or (b) the set of nonexported predicates and functions of the module,
+  the order of their definitions does not match the order of their
+  declarations. The first option applies only to predicates and functions
+  defined by Mercury clauses; the second applies to predicates and functions
+  defined by either Mercury clauses or foreign procedures.
+
+  The option `--warn-inconsistent-pred-order` is a shorter synonym for
+  `--warn-inconsistent-pred-order-clauses`.
+
+* `--warn-insts-with-functors-without-type`
+
+  This option asks the compiler to generate a warning for inst definitions
+  that specify functors but do not specify what type they are for.
+
+* `--warn-interface-imports-in-parents`
+
+  This option asks the compiler to generate a warning for modules that are
+  imported in the interface of a parent module, but not used in the interface
+  of that module.
+
+* `--warn-non-contiguous-decls`
+
+  This option asks the compiler to generate a warning if the mode
+  declaration(s) of a predicate or function does not immediately follow its
+  `:- pred` or `:- func` declaration. This is option is turned on by default.
+
+* `--warn-suspected-occurs-check-failure`
+
+  We have significantly improved the compiler's ability to detect, and
+  to generate warnings about, code that violates the occurs check. This
+  option is turned on by default.
+
+* `--warn-suspicious-foreign-code`
+
+  This option asks the compiler to warn about possible errors in the bodies of
+  `foreign_code` pragmas.
+
+### New verbosity options
+
+* `--limit-error-contexts`
+
+  This option asks the compiler the restrict the errors and warnings it prints
+  to those originating from a named file or files and/or specified ranges of
+  line numbers.
+
+### New link options
+
+* `--no-default-runtime-library-directory`
+
+  This new option prevents the compiler from adding any directories to the
+  runtime search path automatically.
+
+### New output options
+
+* `--output-class-dir`, `--output-class-directory`
+
+   This option causes the compiler to print the name of the directory in
+   which generated Java class files will be placed.
+
+* `--output-csharp-compiler`
+
+  This option causes the compiler to print the command used to invoke
+  the C# compiler.
+
+* `--output-target-arch`
+
+  This option causes the compiler to print the target architecture.
+
+### New auxiliary output options
+
+* `--show-definitions`
+
+  This option causes the compiler to write out a list of the types, insts,
+  modes, predicates, functions, typeclasses and instances defined in a module
+  to a file named `<module>.defns`.
+
+* `--show-definition-line-counts`
+
+  This option causes the compiler to write out a list of predicates and
+  functions defined in a module, together with the names of the files
+  containing them and their approximate line counts, to a file named
+  `<module>.defn_line_counts`.
+
+### Changes to output options
+
+* `--generate-module-order`, `--imports-graph`
+
+  These options no longer imply `--generate-dependencies`.
+
+### Changes to link options
+
+* `--mercury-linkage`
+
+  The compiler no longer sets the runtime search path when
+  the value of `--mercury-linkage` is `static`.
+
+### Changes to optimizations
+
+* We have extended tail call optimization from self recursive calls only
+  to mutually recursive calls as well, when generating high level C code,
+  C# code, or Java code. (The compiler has long been able apply tail call
+  optimization to mutually recursive calls when generating low level C code.)
+
+* We have disabled intermodule optimisation of any predicates or functions
+  using `try` goals. This fixes a serious issue as `try` goals are not
+  properly written to `.opt` files, so when read back would not actually
+  catch any exceptions.
+
+### Bug fixes
+
+* We have fixed some bugs with constrained polymorphic modes.
+
+* The compiler now reports an error for binary/octal/hexadecimal integer
+  literals that cannot be represented in the compiler's native `int` type.
+
+* [Mantis bug #3]. We have fixed a long-standing bug causing crashes in
+  deep profiling grades, related to unify/compare for tuples.
+
+* [Mantis bug #184]. We have fixed a bug that caused a compiler abort in the
+  presence of unsatisfied type class constraints.
+
+* [Mantis bug #196]. We have made binary compatibility checks in C grades
+  work again; GCC and clang were optimizing them away.
+
+* [Mantis bug #264]. Putting a function with a non-default signature into a
+  ground term is now no longer allowed. This is because extracting the function
+  from the term would assume the default function signature.
+
+* [Mantis bug #278]. We have fixed a bug where erroneous state variable use
+  in the head of a lambda expression would cause a compiler abort instead of
+  generating an error message.
+
+* [Mantis bug #318]. We no longer erroneously report an error if a
+  `foreign_type` pragma precedes the `:- type` declaration to which it applies.
+
+* [Mantis bug #388]. We have fixed a bug where JAR files were being installed
+  with incorrect permissions.
+
+* [Mantis bug #391]. We have fixed a bug where the conditions on `trace` goals
+  were being discarded when inlined across module boundaries.
+
+* [Mantis bug #402]. The current state of a state variable can now be used in
+  the head of a `require_complete_switch` scope.
+
+* [Mantis bug #415]. We have fixed a bug that caused the compiler to go into
+  an infinite loop when pretty printing recursive insts for use in error
+  messages.
+
+* [Mantis bug #420]. We have fixed a bug where `try` goals that were inlined
+  across module boundaries would ignore exceptions instead of catching them.
+
+* [Mantis bug #436]. We have fixed a bug where the compiler would silently
+  allow a `foreign_enum` pragma to contain a constructor not belonging to the
+  type that is the subject of the pragma.
+
+* [Mantis bug #437]. We have fixed a bug that caused the compiler to abort if
+  an empty submodule was encountered.
+
+### Other changes
+
+* The C# back-end now bootstraps.
+
+* The Java back-end now bootstraps.
+
+* The old IL back-end has been deleted.
+
+* The Erlang backend is deprecated and will be removed in a future release.
+
+* Class files generated for executables in the Java grade are now automatically
+  packaged up into Java archives (JARs).
+
+* We have upgraded the bundled Boehm GC to v7.6.10 and libatomic_ops to v7.6.2.
+
+Portability improvements
+------------------------
+
+* The `asm_fast*` and `reg*` grades now work on 64-bit Intel OS X systems when
+  using GCC as the C compiler.
+
+  See README.MacOS for further details.
+
+* We have improved support for FreeBSD, specifically:
+
+    - Allowing architectures other than `i*86`.
+    - Allowing the use of shared libraries.
+    - Enabling support for threads.
+    - Enabling parallel job support with `mmc --make`.
+
+  See README.FreeBSD for further details.
+
+* We have added support for OpenBSD.
+
+  See README.OpenBSD for further details.
+
+* We have added support for Linux systems using musl libc.
+
+* We have improved support for AIX.
+
+  See README.AIX for further details.
+
+* The NetBSD `editline` library may now be used in place of GNU `readline` to
+  provide line editing capabilities in the debugger.
+
+* [Mantis bug #357]. We now use the `libdispatch` implementation of semaphores
+  on OS X as the POSIX one was a non-functional stub.
+
+* [Mantis bug #463]. We now support the use of the Microsoft C# compiler
+  (i.e. Roslyn) in POSIX environments.
+
+Changes to the Mercury debugger
+-------------------------------
+
+* Interactive queries are now supported on OS X.
+
+* The `break` command can now auto-complete on the filename:linenumber pairs
+  of events, provided the Mercury system can access the readline library.
+
+* Interactive queries have been improved:
+
+    - Queries can use variable bindings from the current environment.
+    - Exceptions thrown from queries are properly handled.
+    - Non-canonical output bindings are now printed in solutions.
+    - Underscore variables are no longer printed in solutions.
+
+* We have added a `browse --web` command to view terms in a web browser.
+
+Editor support
+--------------
+
+* The vim syntax highlighting files have been significantly improved
+  thanks to Sebastian Godelet.
+
+Changes to the extras distribution
+----------------------------------
+
+* We have added support for Unicode and other enhancements to the `lex` and
+  `regex` libraries. Thanks to Sebastian Godelet.
+
+* We have added some additional random number generator implementations for
+  use with the new random number generator framework.
+
+Known issues
+------------
+
+* [Mantis bug #466]. The experimental support for dependent parallel
+  conjunctions in low-level C grades is known to sometimes cause aborts
+  in the code generator.
+
+

  .NET CLR back-end history
  -------------------------
diff --git a/NEWS b/NEWS
index 93d2c96..ad3dd94 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,5 @@
-NEWS since Mercury 20.01.x
-==========================
+NEWS for Mercury 20.06
+======================

  Changes that may break compatibility
  ------------------------------------
@@ -321,1371 +321,4 @@ Changes to the Mercury implementation

  * We have upgraded the bundled Boehm GC to v7.6.12 and libatomic_ops to v7.6.8.

-NEWS for Mercury 20.01.2
-========================
-
-This is a bug-fix release.
-
-* We have a fixed bug that prevented the runtime from building correctly
-  in C grades on 32-bit platforms when *not* using GCC as the C compiler.
-
-* [Mantis bug #461]. We have fixed an assertion failure affecting programs
-  in low-level C parallel grades as they exit.
-
-NEWS for Mercury 20.01.1
-========================
-
-This is a bug-fix release.
-
-* We have added a new option `--warn-suspicious-recursion` that asks the
-  compiler to warn about recursive calls which are likely to have problems,
-  such as leading to infinite recursion. (This feature was present in the
-  20.01 release but not announced.)
-
-* We now allow combined higher-order types and insts as direct arguments of
-  functors in discriminated unions, as in the following type:
-
-        :- type job
-            --->    job(pred(int::out, io::di, io::uo) is det).
-
-  For any construction unification using this functor the argument must have
-  the required higher-order inst; it is a mode error if it does not. When
-  terms of type `job` with inst `ground` are deconstructed, the argument is
-  inferred to have the given inst, allowing a higher-order call in that mode.
-  (This feature was present in the 20.01 release but not announced.)
-
-* [Mantis bug #496]. The compiler now emits a reminder about the limitation
-  of common subexpression elimination in the presence of uniqueness when
-  this is a possible cause of determinism errors.
-
-  As of version 20.01, common subexpression elimination does not transform
-
-         (
-             X = f(A1, ..., An),
-             goal A
-         ;
-             X = f(B1, ..., Bn),
-             goal B
-         )
-
-  into
-
-         X = f(X1, ..., Xn),
-         (
-             A1 = X1, ..., An = Xn,
-             goal A
-         ;
-             B1 = X1, ..., Bn = Xn,
-             goal B
-         )
-
-  when the insts of some of the arguments of `X` are at least partially unique.
-  This is because the current mode analysis cannot track uniqueness through
-  the extra unifications that this transformation introduces.
-
-NEWS for Mercury 20.01
-======================
-
-Changes to the core libraries license
--------------------------------------
-
-* We have modified the terms under which the Mercury core libraries are
-  licensed by adding an exception to the requirements of clause 6 for
-  executable files linked against the Mercury core libraries.
-
-  See the file COPYING.LIB for the terms of the Mercury core library
-  license.
-
-  See the file LICENSE for licensing information in general.
-
-  The licensing of the compiler and other parts of the system has **not**
-  been changed.
-
-Changes that may break compatibility
-------------------------------------
-
-* When the Mercury compiler looks at code using Mercury keywords (such as
-  `"func"` and `"pred"`) and Mercury operators (such as the clause neck
-  operator `":-"`) but which cannot be parsed as the Mercury constructs
-  that those Mercury keywords and operators are part of, it now generates
-  a specific error message for each discrepancy. In the past, when it found
-  such code, the compiler considered such code to construct terms and/or
-  to call functions and predicates. Usually, the terms did not belong to
-  any declared type and the called functions and predicates did not exist,
-  leading to confusing error messages from the compiler.
-
-  The compiler's new approach generates considerably better diagnostics,
-  but it does mean that code that uses Mercury's keywords and/or operators
-  in ways that are inconsistent with Mercury's own uses of those keywords
-  and operators will not compile anymore. Such code will need to be changed,
-  typically by changing the names of some function symbols, functions
-  or predicates.
-
-* Code that switches on a field of a term could previously written directly as
-
-        (
-            Term ^ field = value1,
-            ...
-        ;
-            Term ^ field = value2,
-            ...
-        )
-
-    The compiler would then internally rearrange this as
-
-        Field = Term ^ field,
-        (
-            Field = value1,
-            ...
-        ;
-            Field = value2,
-            ...
-        )
-
-    and then recognize this as a switch on `Field`.
-
-    However, it turns out that while this transformation is valid
-    in the vast majority of cases (well in excess of 99%), it is not valid
-    in some rare circumstances involving terms with unique arguments.
-    This means that the current version of the compiler is not allowed
-    to do the above transformation automatically, so programmers must
-    perform it themselves if needed.
-
-* We have enabled stricter checking of non-ground final insts to reject more
-  mode-incorrect code. Due to compiler limitations, some code that should be
-  accepted will now be rejected. They will require modifications to appease
-  the compiler. [Mantis bugs #86, #117, #191].
-
-* We have enabled stricter checking of the requirement that a type, inst
-  or a mode that is *not* exported from a module may not be used in the
-  declarations of entities (such as predicates and typeclasses) that *is*
-  exported from that module. This may require the explicit export of e.g.
-  some types that previously were not exported.
-
-* We have enabled stricter checking of type declarations and definitions:
-  all declarations and definitions of a type must agree on whether the type
-  is a solver type or not, and the definitions (as opposed to the names)
-  of solver types may not be exported from their defining module.
-
-* We have enabled stricter checking of module accessibility rules.
-  If a module `m` has an `import_module` or `use_module` declaration for
-  module `x.y.z`, it must also have `import_module` or `use_module`
-  declarations for its ancestors `x` and `x.y`. And if the import or use
-  of `x.y.z` is in module `m`'s interface, then the import or use of `x.y.z`'s
-  ancestor modules must also be in the interface.
-
-* The compiler now requires that, in projects that do not build
-  a `Mercury.modules` file using e.g. `mmc -f *.m`, submodules must be stored
-  in files whose name is the fully qualified module name followed by `.m`.
-  (This means that e.g. a module named `a.b.c` must be in a file named
-  `a.b.c.m`.) The reason for this change is that without it, the compiler
-  cannot tell whether a file named e.g. `lexer.m` contains the Mercury
-  standard library module `lexer`, or a submodule of a user-written
-  parent module. [Mantis bug #489].
-
-* The `:- module` declaration in a separate submodule now must contain the
-  fully qualified module name.
-
-* References to everything imported via `:- use_module` declarations
-  must now be fully module qualified.
-
-* `for` is now an operator. (See the extension of the syntax of inst
-  declarations below.)
-
-* It is now an error for a program to redefine a builtin type. The affected
-  type names are:
-
-        int
-        int{8,16,32,64}
-        uint
-        uint{8,16,32,64}
-        float
-        character
-        string
-        {}
-        =
-        pred
-        func
-        pure
-        semipure
-        impure
-        ''
-
-* It is now an error for a program to redefine a builtin inst. The affected
-  inst names are:
-
-        =<
-        any
-        bound
-        bound_unique
-        clobbered
-        clobbered_any
-        free
-        ground
-        is
-        mostly_clobbered
-        mostly_unique
-        mostly_unique_any
-        not_reached
-        unique
-        unique_any
-
-* It is now an error for a program to redefine a builtin mode. The affected
-  mode names are:
-
-        =
-        >>
-        any_func
-        any_pred
-        func
-        is
-        pred
-
-* We have deleted the builtin inst synonyms `old` and `new`: their uses
-  should be replaced with `any` and `free` respectively.
-
-* We have deleted the builtin modes `no` and `oo`: their uses should be
-  replaced with `oa` and `ia` respectively.
-
-* The minimum version of the Java platform required by Mercury's Java
-  backend is now Java SE 8.
-
-* The representation of integer constants in the standard library's `term`
-  and `lexer` modules has been generalised. The base, signedness and size of
-  each integer constant is now recorded. Furthermore, these modules now use
-  arbitrary-precision integers to represent the values of integer constants.
-
-  Code that relies on the old representation of integer constants used by
-  the `term` or `lexer` modules may use the `old_term_parser` library in the
-  extras instead.
-
-* We have changed the semantics of `int.(<<)` and `int.(>>)` so that they throw
-  an exception if their second operand is not in [0, bits_per_int). For now,
-  the old behaviour of these operations is provided by the functions
-  `int.legacy_left_shift/2` and `int.legacy_right_shift/2`. These functions
-  will be deleted in a future release.
-
-* We have changed the semantics of `int.abs/1` so that it throws an exception
-  if its argument is equal to `int.min_int`. The old behaviour of this function
-  is provided by the new function `int.unchecked_abs/1`.
-
-* We have changed the semantics of `array.map_corresponding_foldl/6` so that it
-  throws an exception if the input arrays differ in size.
-
-* We have changed the semantics of `array.shrink/3` and `array.resize/4`
-  so that they throw an exception if their first argument is negative.
-
-* We have changed the semantics of `array.fetch_items/4` so that it always
-  throws an exception if its second or third argument is out of bounds.
-  Previously, it would return an empty if list if its third argument was less
-  than the second even if one, or both, of these arguments was out of bounds.
-
-* We have removed the `io.poly_type` equivalence type from the `io` module.
-  `string.poly_type` should be used directly. This may require an explicit
-  import of the `string` module.
-
-* The predicates and functions in the `term` module that provide conversion
-  from arbitrary types to terms and vice versa have been moved to their own
-  module, `term_conversion`. See the changes to the `term` module below for
-  a list of affected predicates and functions.
-
-* We have removed legacy support for the following systems:
-
-    - IRIX
-    - OSF/1
-
-* The following compilation grades are no longer supported:
-
-    - asm_jump*
-    - jump*
-    - hl_nest*
-    - hlc_nest*
-    - il*
-
-Changes to the Mercury language
--------------------------------
-
-* We have added nine new primitive types: `uint`, `int8`, `int16`, `int32`,
-  `int64`, `uint8`, `uint16`, `uint32` and `uint64`. The type `uint` is an
-  unsigned integer type of the same size as Mercury's `int` type; the types
-  `int8`, `int16`, `int32` and `int64` are signed integer types of width
-  8, 16, 32 and 64 bits respectively; the types `uint8`, `uint16`, `uint32`
-  and `uint64` are unsigned integer types of width 8, 16, 32 and 64 bits
-  respectively.
-
-    Literals of these new types must have a distinguishing suffix, for example:
-
-        999u
-        561i32
-        0b1111100111i64
-        0o16u8
-        0x3e732i64
-
-    Basic operations on the new primitive types are provided by the
-    new standard library modules: `uint`, `int8`, `uint8`, `int16`, `uint16`,
-    `int32`, `uint32` `int64`, and `uint64`.
-
-* We have added a new kind of scope to the language: determinism checks
-  for switch arms. These scopes are introduced by any of the new keywords
-
-        require_switch_arms_det
-        require_switch_arms_semidet
-        require_switch_arms_multi
-        require_switch_arms_nondet
-        require_switch_arms_cc_multi
-        require_switch_arms_cc_nondet
-        require_switch_arms_erroneous
-        require_switch_arms_failure
-
-    `require_switch_arms_<determinism> [Var] Goal` tells the compiler
-    to require `Goal` to be a switch on `Var` in which all the switch arms
-    have determinisms at least as tight as `<determinism>`, and to generate
-    error messages for any violations of this requirement.
-
-* We have changed the meaning of `require_complete_switch` scopes slightly:
-  the compiler now generates an error if the goal inside the scope
-  is not a switch on the named variable.
-
-* We have added a new kind of scope to the language for disabling warnings
-  within the scope. A goal such as
-
-        disable_warnings [singleton_vars] (
-           Goal
-        )
-
-    is equivalent to `Goal`, with the exception that the compiler will not
-    generate warnings about singleton variables inside `Goal`.
-
-* We have extended the syntax of `:- inst` declarations to allow programmers
-  to specify which type constructor's values the inst is meant for.
-  The syntax consists of adding `for`, followed by the type constructor's
-  name and arity, between the name of the inst and its definition, like this:
-
-        :- inst listskel(Inst) for list/1
-            --->    []
-            ;       [Inst | listskel(Inst)].
-
-  For the time being, this is useful only as a documentation of the
-  programmer's intention; the compiler does not (yet) prevent the use of insts
-  on values of types other than the one they were declared to be for.
-
-* We have added an extension to include external files
-  in `pragma foreign_decl` and `pragma foreign_code` declarations.
-
-* We have added a foreign type assertion `word_aligned_pointer` that
-  allows the Mercury implementation to avoid boxing values of the foreign type
-  that the assertion is for when the type appears as the sole argument
-  of a data constructor.
-
-* We have added a new pragma named `consider_used`. This pragma tells
-  the compiler to consider the predicate or function it names to be used,
-  preventing it from generating unused procedure warnings either for
-  any of its procedures, or for any of the procedures they call,
-  directly or indirectly.
-
-* We have added an optional second field to the `obsolete` pragma.
-  When present, it may contain a list of the names and arities of
-  predicates and/or functions that programmers should consider using
-  instead of the obsolete predicate or function.
-
-* We have added an `obsolete_proc` pragma. While the `obsolete` pragma
-  declares all modes of a predicate or function to be obsolete, the
-  `obsolete_proc` pragma declares only one mode of a predicate or function
-  to be obsolete. Like the updated version of the `obsolete` pragma,
-  the `obsolete_proc` pragma may have a second argument naming one or more
-  suggested replacements.
-
-* The Java backend now supports defining foreign types as primitive Java
-  types.
-
-* Digits in numeric literals may now be separated by underscores in order
-  to improve readability.
-
-Changes to the Mercury standard library
----------------------------------------
-
-### New Integer Modules
-
-* We have added the new modules `uint`, `int8`, `uint8`, `int16`, `uint16`,
-  `int32`, `uint32`, `int64` and `uint64`. These modules provide
-  the basic operations on the new integer types.
-
-  Many other standard library modules now have additional predicates
-  that support the new integer types; see the entries for those modules
-  for details.
-
-### New Random Number Generator Framework
-
-* We have added a new type class based interface to random number generators
-  to the `random` module. The new interface provides predicates for:
-
-    - generating pseudo-random integers that are uniformly distributed
-      in a range.
-    - generating pseudo-random floats that are uniformly distributed
-      in a range.
-    - generating pseudo-random floats from a normal (i.e. Gaussian)
-      distribution.
-    - generating a random permutation of an array.
-    - generating a random permutation of a list.
-
-  Three new submodules, `random.sfc16`, `random.sfc32` and `random.sfc64`,
-  provide instances of the new type classes. Further instances can be found
-  in the extras distribution (see below).
-
-### New Module: `diet`
-
-* This module provides discrete interval encoding trees, which are a highly
-  efficient set implementation for fat sets. This module is a contribution
-  from Yes Logic Pty. Ltd.
-
-### New Module: `edit_seq`
-
-* This module provides operations for computing and manipulating edit
-  sequences. Given two sequences of items, an edit sequence is the shortest
-  sequence of edit operations (deletes, inserts and/or replaces) that will
-  transform the first sequence into the second.
-
-### New Module: `psqueue`
-
-* This module implements a priority search queue ADT. This is a blend between
-  a priority queue and a map. This was contributed by Matthias Güdemann.
-
-### New Module: `ranges`
-
-* This module represents sets of integers using sorted lists of ranges. This
-  module exports operations that make it particularly suitable for representing
-  domains in finite domain constraint solvers.
-
-### New Module: `term_conversion`
-
-* This module provides generic operations for the conversion of values of
-  arbitrary types to and from terms. These operations were previously
-  provided by the `term` module.
-
-  See the list of changes to the `term` module below.
-
-### New Module: `thread.barrier`
-
-* This module provides the `barrier/0` type. This type can be used to control
-  progress in concurrent code. This module was contributed by
-  Mission Critical IT.
-
-### New Module: `thread.future`
-
-* This module provides the `future/0` and `future_io/0` types. These type can
-  be used to compute values in parallel using other threads. This module was
-  contributed by Mission Critical IT.
-
-### Changes to the `array` module
-
-* The following functions and predicates have been added:
-
-    - `det_least_index/1`
-    - `semidet_least_index/1`
-    - `det_greatest_index/1`
-    - `semidet_greatest_index/1`
-    - `foldl_corresponding/5`
-    - `foldl2_corresponding/7`
-    - `fill/3`
-    - `fill_range/5`
-    - `swap/4`
-    - `unsafe_swap/4`
-
-* The following functions have been deprecated and will be removed in a future
-  release:
-
-    - `least_index/1`
-    - `greatest_index/1`
-
-### Changes to the `array2d` module
-
-* The following functions and predicates have been added:
-
-    - `is_empty/1`
-    - `fill/3`
-    - `from_array/3`
-
-### Changes to the `assoc_list` module
-
-* The following predicate has been added:
-
-    - `svremove/4`
-
-* `svremove/4` is like `remove/4` but its arguments are in an order
-  more conducive to the use of state variable notation.
-
-### Changes to the `bag` module
-
-* The following functions and predicates have been added:
-
-    - `singleton/1`
-    - `insert_duplicates/4`
-    - `det_insert_duplicates/4`
-    - `det_insert_duplicates/3`
-
-* The following predicate and function have been deprecated and will be
-  remove in a future release.
-
-    - `to_set_without_duplicates/2`
-    - `to_set_without_duplicates/1`
-
-### Changes to the `bitmap` module
-
-* The following predicates and functions have been added:
-
-    - `is_empty/1`
-    - `det_from_string/1`
-    - `get_uint8/1`, `unsafe_get_uint8/1`
-    - `set_uint8/4`, `unsafe_set_uint8/4`
-
-### Changes to the `builtin` module
-
-* The following predicate and function have been deprecated and will be removed
-  in a future release:
-
-    - `promise_only_solution/1`
-    - `promise_only_solution_io/4`
-
-  Existing code that uses either of these should be replaced with code that
-  uses a `promise_equivalent_solutions` goal instead.
-
-* The following modes have been deprecated and will be removed in a future
-  release:
-
-    - `input/0`
-    - `output/0`
-
-  Existing code that uses these modes should replace their use with `in`
-  or `out` respectively.
-
-### Changes to the `calendar` module
-
-* The following functions and predicates have been added:
-
-    - `int_to_month/2`
-    - `det_int_to_month/1`
-    - `int0_to_month/2`
-    - `det_int0_to_month/1`
-    - `month_to_int/1`
-    - `month_to_int0/1`
-    - `same_date/1`
-
-### Changes to the `char` module
-
-* The following predicates and functions have been added:
-
-    - `is_ascii/1`
-    - `is_decimal_digit/1`
-    - `is_base_digit/2`
-    - `int_to_binary_digit/2`, `det_int_to_binary_digit/1`
-    - `int_to_octal_digit/2`, `det_int_to_octal_digit/1`
-    - `int_to_decimal_digit/2`, `det_int_to_decimal_digit/1`
-    - `int_to_hex_digit/2`, `det_int_to_hex_digit/1`
-    - `base_int_to_digit/3`, `det_base_int_to_digit/2`
-    - `binary_digit_to_int/2`, `det_binary_digit_to_int/1`
-    - `octal_digit_to_int/2`, `det_octal_digit_to_int/1`
-    - `decimal_digit_to_int/2`, `det_decimal_digit_to_int/1`
-    - `hex_digit_to_int/2`, `det_hex_digit_to_int/1`
-    - `base_digit_to_int/3`, `det_base_digit_to_int/2`
-    - `is_leading_surrogate/1`, `is_trailing_surrogate/1`
-    - `is_control/1`, `is_space_separator/1`, `is_paragraph_separator/1`
-    - `is_line_separator/1`, `is_private_use/1`
-
-* The following predicates have been deprecated and will either be removed or
-  have their semantics changed in a future release:
-
-    - `is_hex_digit/2`
-    - `int_to_hex_char/2`
-    - `digit_to_int/2`
-    - `int_to_digit/2`
-    - `det_int_to_digit/1`, `det_int_to_digit/2`
-
-  NOTE: existing code that calls `digit_to_int/2` assuming that it will
-  only succeed for decimal digits (0-9) may be broken.
-
-### Changes to the `cord` module
-
-* The following predicates and functions have been added:
-
-    - `to_list/1`     (synonym for the existing `list/1` function)
-    - `to_rev_list/1` (synonym for the existing `rev_list/1` function)
-    - `rev_cord_list_to_cord/1` (similar to `cord_list_to_cord/1`)
-    - `rev_cord_list_to_list/1` (similar to `cord_list_to_list/1`)
-    - `cons/3`
-    - `snoc/3`
-    - `find_first_match/3`
-
-### Changes to the `deconstruct` module
-
-* The predicate `functor/4` has been modified so that for character and string
-  data, any control characters in the functor representation are escaped.
-
-### Changes to the `digraph` module
-
-* The following predicates and functions have been added:
-
-    - `return_vertices_in_from_to_order/2`
-    - `return_vertices_in_to_from_order/2`
-    - `return_sccs_in_from_to_order/1`
-    - `return_sccs_in_to_from_order/1`
-
-### Changes to the `float` module
-
-* The following predicates and function have been added:
-
-    - `is_finite/1`
-    - `is_zero/1`
-    - `is_infinite/1`        (synonym for the existing `is_inf/1` predicate)
-    - `is_nan_or_infinite/1` (synonym for the existing `is_nan_or_inf/1` predicate)
-    - `infinity/0`
-
-### Changes to the `getopt` and `getopt_io` modules
-
-* We have added variants of the `process_options` predicates that return errors
-  using a type instead of strings. A new function, `option_error_to_string/1`,
-  can be used to convert values of the new error type into strings.
-
-### Changes to the `hash_table` module
-
-* The following predicates have been added:
-
-    - `fold2/6`
-    - `fold3/8`
-
-### Changes to the `int` module
-
-* The following predicates and functions have been added:
-
-    - `all_true_in_range/3`
-    - `unchecked_abs/1`
-    - `nabs/1`
-
-* The following predicate has been deprecated:
-
-    - `is/2`
-
-### Changes to the `integer` module
-
-* The following predicates and functions have been added:
-
-    - `from_string/2`
-    - `from_base_string/3`
-    - `to_int/2`
-    - `det_to_int/1`
-    - `to_base_string/2`
-    - `negative_one/0`, `two/0`, `ten/0`
-    - `is_zero/1`
-    - `to_uint/2`
-    - `det_to_uint/1`
-    - `from_uint/1`
-    - `to_int{8,16,32,64}/2`
-    - `det_to_int{8,16,32,64}/1`
-    - `from_int{8,16,32,64}/1`
-    - `to_uint{8,16,32,64}/2`
-    - `det_to_uint{8,16,32,64}/1`
-    - `from_uint{8,16,32,64}/1`
-
-* The following functions have been deprecated and will be removed in a
-  future release:
-
-    - `from_string/1`
-    - `from_base_string/2`
-    - `int/1`
-
-### Changes to the `io` module
-
-* The following predicates have been added:
-
-    - `write_uint/3`, `write_uint/4`
-    - `write_int{8,16,32,64}/3`, `write_int{8,16,32,64}/4`
-    - `write_uint{8,16,32,64}/3`, `write_uint{8,16,32,64}/4`
-    - `write_binary_int8/3`, `write_binary_int8/4`
-    - `write_binary_uint8/3`, `write_binary_uint8/4`
-    - `write_binary_int{16,32,64}/3`, `write_binary_int{16,32,64}/4`
-    - `write_binary_int{16,32,64}_{le,be}/3`, `write_binary_int{16,32,64}_{le,be}/4`
-    - `read_binary_int8/[34]`
-    - `read_binary_uint8/[34]`
-    - `putback_int8/[34]`
-    - `putback_uint8/[34]`
-    - `read_binary_int{16,32,64}/3`, `read_binary_int{16,32,64}/4`
-    - `read_binary_int{16,32,64}_{le,be}/3`, `read_binary_int{16,32,64}_{le,be}/4`
-    - `read_binary_uint{16,32,64}/3`, `read_binary_uint{16,32,64}/4`
-    - `read_binary_uint{16,32,64}_{le,be}/3`, `read_binary_uint{16,32,64}_{le,be}/4`
-    - `read_line_as_string_and_num_code_units/[34]`
-    - `print_line/[34]`, `write_line/[34]`
-    - `write_array/[56]` (similar to `write_list` but for arrays)
-    - `temp_directory/3`
-    - `make_temp_directory/3`
-    - `make_temp_directory/5`
-    - `set_environment_var/5`
-    - `have_set_environment_var/0`
-    - `seek_binary_input64/5`, `seek_binary_output64/5`
-    - `binary_input_stream_offset64/4`, `binary_output_stream_offset64/4`
-
-* The `print_line` and `write_line` family of predicates behave like the
-  `print` and `write` predicates, but also write a terminating newline.
-
-* `print` now outputs arbitrary precision integers in their decimal form
-   instead of printing their underlying representation.
-
-* The predicate `set_environment_var/5` returns an `io.res` value rather than
-  throwing an exception. The predicate `have_set_environment_var/0` can test
-  whether the current platform supports the ability to set environment
-  variables.
-
-* We have made the following predicates exception safe: the current input or
-  output stream is restored to the original stream if an exception is thrown
-  during their execution:
-
-     - `read/4`
-     - `write_list/6`
-     - `write_array/6`
-     - `read_binary/4`
-     - `write_binary/4`
-
-### Changes to the `lexer` module
-
-* We have added predicates that read from an explicitly specified input stream,
-  not from the current input stream.
-
-### Changes to the `list` module
-
-* The following predicates and functions have been added:
-
-    - `any_true/2`
-    - `any_false/2`
-    - `reverse_prepend/2`
-    - `reverse_prepend/3`
-    - `take_while/4`
-    - `take_while/3`
-    - `take_while/2`
-    - `drop_while/3`
-    - `drop_while/2`
-    - `one_or_more_to_list/1`
-    - `list_to_one_or_more/2`
-    - `list_to_one_or_more_det/2`
-
-* The following predicate has been deprecated and will be remove in a future
-  release:
-
-    - `takewhile/4` (use `take_while/4` instead)
-
-* The `take/3` and `drop/3` predicates have been modified so that they fail if
-  their first argument is less than zero.
-
-* The `split_upto/4` and `take_upto/3` predicates and `take_upto/2` function
-  have been modified so that they throw an exception if their first argument
-  is negative.
-
-### Changes to the `map` module
-
-* The following predicates have been added:
-
-    - `foldl5/12`
-    - `foldr5/12`
-    - `map_foldl4/11`
-    - `intersect_list/4`
-    - `union_list/4`
-    - `select_unselect/4`
-    - `select_unselect_sorted_list/4`
-
-### Changes to the `math` module
-
-* The following function and predicate have been added:
-
-    - `fma/3`
-    - `have_fma/0`
-
-* `fma/3` provides the fused multiply-add operation on platforms that
-  support that operation. The predicate `have_fma/0` may be used to check for
-  this support.
-
-### Changes to the `maybe` module
-
-* We have a added a new type, `maybe_errors`, to the `maybe` module.
-
-* The following predicate and function have been added:
-
-    - `fold2_maybe/6`
-    - `maybe_default/2`
-    - `pred_to_maybe/1`
-    - `func_to_maybe/1`
-
-### Changes to the `parser` module
-
-* We have added predicates that read from an explicitly specified input stream,
-  not from the current input stream.
-
-### Changes to the `pretty_printer` module
-
-* The type `formatter_limit` has been renamed to `func_symbol_limit`, since
-  this better reflects the type's purpose.
-
-* We have replaced the `set_formatter` function with a predicate of the same
-  name, since this allows the use of state variable notation when
-  setting up more than one type-specific formatter,
-
-* We have renamed the `write_doc_to_stream` predicate as `put_doc`, to better
-  fit in with the names other predicates that operate on values of the
-  `stream.writer` typeclass, and changed its interface to group
-  the prettyprinter parameters together in a value of the type
-  that was designed for this purpose.
-
-### Changes to the `random` module.
-
-* The existing random number generator defined in this module has been
-  deprecated in favour of the type class based random number generation
-  framework described above.
-
-  As such, the `supply/0` type and the following predicates have been
-  deprecated and will be deleted in a future release:
-
-    - `init/2`
-    - `random/3`
-    - `random/5`
-    - `randmax/3`
-    - `randcount/3`
-    - `permutation/4`
-
-### Changes to the `rbtree` module
-
-* The following predicates have been added:
-
-    - `foldl_values/4`
-    - `foldl2_values/6`
-
-### Changes to the `require` module
-
-* The following predicate and function have been added:
-
-    - `error/2`
-    - `func_error/2`
-
-### Changes to the `set` module
-
-* The following predicates and/or functions have been added:
-
-    - `intersection_and_differences/5`
-    - `det_remove/3`
-    - `det_remove_list/3`
-    - `rev_sorted_list_to_set/[12]`
-
-* The following predicate and/or functions have been deprecated:
-
-    - `empty/1`
-    - `non_empty/1`
-    - `set/1`
-
-    Similar changes have been made to the other set implementations
-    in the library.
-
-### Changes to the `std_util` module
-
-* The following functions have been deprecated:
-
-    - `maybe_pred/3`
-    - `maybe_func/2`
-
-### Changes to the `stream.string_writer` module
-
-* The following predicates have been added:
-
-    - `put_uint/4`
-    - `put_int{8,16,32,64}/4`
-    - `put_uint{8,16,32,64}/4`
-
-* `print` now outputs arbitrary precision integers in their decimal form
-  instead of printing their underlying representation.
-
-### Changes to the `string` module
-
-* Predicates and functions in this module now have defined behaviours
-  for strings containing ill-formed sequences. Also, some predicates and
-  functions now have defined behaviour on surrogate code points
-  (e.g. failing or throwing an exception) that was previously undefined.
-
-* The following predicates have been added:
-
-    - `is_all_alnum/1`
-    - `is_empty/1`
-    - `is_well_formed/1`
-    - `from_code_unit_list_allow_ill_formed/2`
-    - `to_utf8_code_unit_list/2`
-    - `to_utf16_code_unit_list/2`
-    - `from_utf8_code_unit_list/2`
-    - `from_utf16_code_unit_list/2`
-    - `det_remove_prefix/3`
-    - `compare_ignore_case_ascii/3`
-    - `to_rev_char_list/2`
-    - `compare_substrings/6`
-    - `unsafe_compare_substrings/6`
-    - `nondet_append/3`
-    - `append_string_pieces/2`
-    - `unsafe_append_string_pieces/2`
-    - `unsafe_sub_string_search_start/4`
-    - `index_next_repl/5`
-    - `unsafe_index_next_repl/5`
-    - `prev_index_repl/5`
-    - `unsafe_prev_index_repl/5`
-    - `uint_to_string/1`
-    - `int{8,16,32,64}_to_string/1`
-    - `uint{8,16,32,64}_to_string/1`
-
-* The following procedures have been deprecated:
-
-    - `to_char_list(uo, in)`
-    - `to_rev_char_list(uo, in)`
-    - `from_char_list(out, in)`
-    - `append(out, out, in)`
-    - `prefix(in, out)`
-    - `suffix(in, out)`
-
-* The following obsolete predicates and functions have been removed:
-
-    - `substring/3`
-    - `substring/4`
-    - `unsafe_substring/3`
-    - `unsafe_substring/4`
-    - `foldl_substring/5`
-    - `foldl_substring/6`
-    - `foldl2_substring/8`
-    - `foldl2_substring/8`
-    - `foldr_substring/5`
-    - `foldr_substring/6`
-
-* We have reduced the memory allocated by `to_lower` and `to_upper`.
-
-* `string_to_doc/1` now escapes characters in its input argument with
-  backslash escapes when required.
-
-* [Mantis bug #348]. Float special values, NaNs and Infinities, are now
-  converted to strings in a way that is backend- and grade-independent.
-
-* [Mantis bug #376]. `base_digit_to_int/3` and `det_base_digit_to_int/2` now
-  check for overflow and underflow in all bases, not only base 10.
-
-### Changes to the `store` module
-
-* Procedures in this module no longer acquire the global lock.
-
-### Changes to the `term` module
-
-* The following predicates and functions have been added:
-
-    - `dummy_context_init/0`
-    - `is_dummy_context/1`
-    - `term_to_int/2`
-    - `term_to_uint/2`
-    - `term_to_int{8,16,32,64}/2`
-    - `term_to_uint{8,16,32,64}/2`
-    - `decimal_term_to_int/2`
-    - `int_to_decimal_term/2`
-    - `int{8,16,32,64}_to_decimal_term/2`
-    - `uint_to_decimal_term/2`
-    - `uint{8,16,32,64}_to_decimal_term/2`
-    - `rename_var_in_term/4`
-    - `rename_vars_in_terms/4`
-    - `apply_renaming_in_term/3`
-    - `apply_renaming_in_terms/3`
-    - `apply_renaming_in_var/3`
-    - `apply_renaming_in_vars/3`
-    - `apply_renaming_in_term/3`
-    - `apply_renaming_in_terms/3`
-    - `substitute_var_in_term/4`
-    - `substitute_var_in_terms/4`
-    - `substitute_corresponding_in_term/4`
-    - `substitute_corresponding_in_terms/4`
-    - `apply_substitution_in_term/3`
-    - `apply_substitution_in_terms/3`
-    - `apply_rec_substitution_in_term/3`
-    - `apply_rec_substitution_in_terms/3`
-
-* The following predicates and functions have been moved to the
-  `term_conversion` module:
-
-   - `try_term_to_type/[12]`
-   - `term_to_type/2`
-   - `det_term_to_type/[12]`
-   - `type_to_term/[12]`
-   - `univ_to_term/[12]`
-
-* The following predicates and functions have been deprecated and will be
-  removed in a future release:
-
-   - `var_id/1`
-   - `relabel_variable/[34]`
-   - `relabel_variables/[34]`
-   - `rename/[34]`
-   - `rename_list/[34]`
-   - `apply_renaming/[23]`
-   - `apply_renaming_to_list/[23]`
-   - `apply_variable_renaming_to_var/[23]`
-   - `apply_variable_renaming_to_vars/[23]`
-   - `apply_variable_renaming/[23]`
-   - `apply_variable_renaming_to_list/[23]`
-   - `substitute/[34]`
-   - `substitute_list/[34]`
-   - `substitute_corresponding/[34]`
-   - `substitute_corresponding_list/[34]`
-   - `apply_substitution/[23]`
-   - `apply_substitution_to_list/[23]`
-   - `apply_rec_substitution/[23]`
-   - `apply_rec_substitution_to_list/[23]`
-
-### Changes to the `thread` module
-
-* The following predicates have been added:
-
-    - `spawn_native/4`
-    - `spawn/4`
-    - `num_processors/3`
-
-* `spawn_native/4` allows you to dedicate an OS thread to a Mercury thread.
-
-* `num_processors/3` returns the number of processors available for
-  parallel work.
-
-### Changes to the `thread.mvar` module
-
-* The following predicates and functions have been added:
-
-    - `impure_init/1`
-    - `try_read/4`
-
-* The following function has been deprecated and will be removed in a
-  future release:
-
-    - `init/1`
-
-### Changes to the `thread.semaphore` module
-
-* The following predicate has been deprecated and will be removed in a
-  future release:
-
-     - `init/1`
-
-### Changes to the `time` module
-
-* The following predicates have been added:
-
-    - `localtime/4`
-    - `mktime/4`
-
-* The following functions have been deprecated and will be removed in a
-  future release:
-
-    - `localtime/1`
-    - `mktime/1`
-    - `ctime/1`
-
-### Changes to the `tree234` module
-
-* The following predicate has been added:
-
-    - `map_foldl4/11`
-
-### Changes to the `version_array` module
-
-* The following function has been added:
-
-    - `from_reverse_list/1`
-
-Changes to the Mercury compiler
--------------------------------
-
-### New warning options
-
-* `--inform-incomplete-switch`, `--inform-incomplete-switch-threshold N`
-
-   This option asks the compiler to generate an informational message for
-   switches that do not cover all of the function symbols that the switched-on
-   variable could be bound to.
-
-   The option `--inform-incomplete-switch-threshold N` can be used to restrict
-   the generation of these messages to only switches that *do* cover at least
-   *N* percent of the function symbols that the switched-on variable
-   could be bound to.
-
-* `--inhibit-style-warnings`
-
-  This option asks the compiler not to generate any warnings that are purely
-  about programming style, and do not point out code that is reasonably
-  likely to be wrong.
-
-* `--no-warn-accumulator-swaps`
-
-  We have renamed the `--inhibit-accumulator-warnings` option to
-  `--no-warn-accumulator-swaps`.
-
-* `--warn-dead-preds`
-
-  While the existing option `--warn-dead-procs` asks the compiler to generate
-  warnings for every unused procedure of the module being compiled, this new
-  option asks the compiler to generate a warning for a predicate or function
-  only if none of its procedures is used.
-
-* `--warn-implicit-stream-calls`
-
-  This option asks the compiler to generate a warning for every call to a
-  predicate `p/N` if there is also a predicate `p/(N+1)` which differs from
-  `p/N` only in that it has additional argument at the front of its argument
-  list that specifies an I/O stream. This is intended to generate warnings for
-  calls to predicates such as `io.write_string/3`, which writes to the current
-  output stream, to encourage programmers to call `io.write_string/4` instead.
-  If the option is given, the compiler will also generate warnings for calls
-  to predicates such as `io.see`, `io.seen`, `io.tell` and `io.told`, which
-  set the current input or output streams respectively.
-
-* `--warn-inconsistent-pred-order-clauses`, `--warn-inconsistent-pred-order-foreign-procs`
-
-  Both of these options ask the compiler to generate a warning if, among
-  either (a) the set of exported predicates and functions of the module,
-  or (b) the set of nonexported predicates and functions of the module,
-  the order of their definitions does not match the order of their
-  declarations. The first option applies only to predicates and functions
-  defined by Mercury clauses; the second applies to predicates and functions
-  defined by either Mercury clauses or foreign procedures.
-
-  The option `--warn-inconsistent-pred-order` is a shorter synonym for
-  `--warn-inconsistent-pred-order-clauses`.
-
-* `--warn-insts-with-functors-without-type`
-
-  This option asks the compiler to generate a warning for inst definitions
-  that specify functors but do not specify what type they are for.
-
-* `--warn-interface-imports-in-parents`
-
-  This option asks the compiler to generate a warning for modules that are
-  imported in the interface of a parent module, but not used in the interface
-  of that module.
-
-* `--warn-non-contiguous-decls`
-
-  This option asks the compiler to generate a warning if the mode
-  declaration(s) of a predicate or function does not immediately follow its
-  `:- pred` or `:- func` declaration. This is option is turned on by default.
-
-* `--warn-suspected-occurs-check-failure`
-
-  We have significantly improved the compiler's ability to detect, and
-  to generate warnings about, code that violates the occurs check. This
-  option is turned on by default.
-
-* `--warn-suspicious-foreign-code`
-
-  This option asks the compiler to warn about possible errors in the bodies of
-  `foreign_code` pragmas.
-
-### New verbosity options
-
-* `--limit-error-contexts`
-
-  This option asks the compiler the restrict the errors and warnings it prints
-  to those originating from a named file or files and/or specified ranges of
-  line numbers.
-
-### New link options
-
-* `--no-default-runtime-library-directory`
-
-  This new option prevents the compiler from adding any directories to the
-  runtime search path automatically.
-
-### New output options
-
-* `--output-class-dir`, `--output-class-directory`
-
-   This option causes the compiler to print the name of the directory in
-   which generated Java class files will be placed.
-
-* `--output-csharp-compiler`
-
-  This option causes the compiler to print the command used to invoke
-  the C# compiler.
-
-* `--output-target-arch`
-
-  This option causes the compiler to print the target architecture.
-
-### New auxiliary output options
-
-* `--show-definitions`
-
-  This option causes the compiler to write out a list of the types, insts,
-  modes, predicates, functions, typeclasses and instances defined in a module
-  to a file named `<module>.defns`.
-
-* `--show-definition-line-counts`
-
-  This option causes the compiler to write out a list of predicates and
-  functions defined in a module, together with the names of the files
-  containing them and their approximate line counts, to a file named
-  `<module>.defn_line_counts`.
-
-### Changes to output options
-
-* `--generate-module-order`, `--imports-graph`
-
-  These options no longer imply `--generate-dependencies`.
-
-### Changes to link options
-
-* `--mercury-linkage`
-
-  The compiler no longer sets the runtime search path when
-  the value of `--mercury-linkage` is `static`.
-
-### Changes to optimizations
-
-* We have extended tail call optimization from self recursive calls only
-  to mutually recursive calls as well, when generating high level C code,
-  C# code, or Java code. (The compiler has long been able apply tail call
-  optimization to mutually recursive calls when generating low level C code.)
-
-* We have disabled intermodule optimisation of any predicates or functions
-  using `try` goals. This fixes a serious issue as `try` goals are not
-  properly written to `.opt` files, so when read back would not actually
-  catch any exceptions.
-
-### Bug fixes
-
-* We have fixed some bugs with constrained polymorphic modes.
-
-* The compiler now reports an error for binary/octal/hexadecimal integer
-  literals that cannot be represented in the compiler's native `int` type.
-
-* [Mantis bug #3]. We have fixed a long-standing bug causing crashes in
-  deep profiling grades, related to unify/compare for tuples.
-
-* [Mantis bug #184]. We have fixed a bug that caused a compiler abort in the
-  presence of unsatisfied type class constraints.
-
-* [Mantis bug #196]. We have made binary compatibility checks in C grades
-  work again; GCC and clang were optimizing them away.
-
-* [Mantis bug #264]. Putting a function with a non-default signature into a
-  ground term is now no longer allowed. This is because extracting the function
-  from the term would assume the default function signature.
-
-* [Mantis bug #278]. We have fixed a bug where erroneous state variable use
-  in the head of a lambda expression would cause a compiler abort instead of
-  generating an error message.
-
-* [Mantis bug #318]. We no longer erroneously report an error if a
-  `foreign_type` pragma precedes the `:- type` declaration to which it applies.
-
-* [Mantis bug #388]. We have fixed a bug where JAR files were being installed
-  with incorrect permissions.
-
-* [Mantis bug #391]. We have fixed a bug where the conditions on `trace` goals
-  were being discarded when inlined across module boundaries.
-
-* [Mantis bug #402]. The current state of a state variable can now be used in
-  the head of a `require_complete_switch` scope.
-
-* [Mantis bug #415]. We have fixed a bug that caused the compiler to go into
-  an infinite loop when pretty printing recursive insts for use in error
-  messages.
-
-* [Mantis bug #420]. We have fixed a bug where `try` goals that were inlined
-  across module boundaries would ignore exceptions instead of catching them.
-
-* [Mantis bug #436]. We have fixed a bug where the compiler would silently
-  allow a `foreign_enum` pragma to contain a constructor not belonging to the
-  type that is the subject of the pragma.
-
-* [Mantis bug #437]. We have fixed a bug that caused the compiler to abort if
-  an empty submodule was encountered.
-
-### Other changes
-
-* The C# back-end now bootstraps.
-
-* The Java back-end now bootstraps.
-
-* The old IL back-end has been deleted.
-
-* The Erlang backend is deprecated and will be removed in a future release.
-
-* Class files generated for executables in the Java grade are now automatically
-  packaged up into Java archives (JARs).
-
-* We have upgraded the bundled Boehm GC to v7.6.10 and libatomic_ops to v7.6.2.
-
-Portability improvements
-------------------------
-
-* The `asm_fast*` and `reg*` grades now work on 64-bit Intel OS X systems when
-  using GCC as the C compiler.
-
-  See README.MacOS for further details.
-
-* We have improved support for FreeBSD, specifically:
-
-    - Allowing architectures other than `i*86`.
-    - Allowing the use of shared libraries.
-    - Enabling support for threads.
-    - Enabling parallel job support with `mmc --make`.
-
-  See README.FreeBSD for further details.
-
-* We have added support for OpenBSD.
-
-  See README.OpenBSD for further details.
-
-* We have added support for Linux systems using musl libc.
-
-* We have improved support for AIX.
-
-  See README.AIX for further details.
-
-* The NetBSD `editline` library may now be used in place of GNU `readline` to
-  provide line editing capabilities in the debugger.
-
-* [Mantis bug #357]. We now use the `libdispatch` implementation of semaphores
-  on OS X as the POSIX one was a non-functional stub.
-
-* [Mantis bug #463]. We now support the use of the Microsoft C# compiler
-  (i.e. Roslyn) in POSIX environments.
-
-Changes to the Mercury debugger
--------------------------------
-
-* Interactive queries are now supported on OS X.
-
-* The `break` command can now auto-complete on the filename:linenumber pairs
-  of events, provided the Mercury system can access the readline library.
-
-* Interactive queries have been improved:
-
-    - Queries can use variable bindings from the current environment.
-    - Exceptions thrown from queries are properly handled.
-    - Non-canonical output bindings are now printed in solutions.
-    - Underscore variables are no longer printed in solutions.
-
-* We have added a `browse --web` command to view terms in a web browser.
-
-Editor support
---------------
-
-* The vim syntax highlighting files have been significantly improved
-  thanks to Sebastian Godelet.
-
-Changes to the extras distribution
-----------------------------------
-
-* We have added support for Unicode and other enhancements to the `lex` and
-  `regex` libraries. Thanks to Sebastian Godelet.
-
-* We have added some additional random number generator implementations for
-  use with the new random number generator framework.
-
-Known issues
-------------
-
-* [Mantis bug #466]. The experimental support for dependent parallel
-  conjunctions in low-level C grades is known to sometimes cause aborts
-  in the code generator.
-
  For news about earlier versions, see the HISTORY file.
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 91d9b67..7deeeba 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -1,5 +1,5 @@

-We are pleased to announce the release of version 20.01 of the Mercury system.
+We are pleased to announce the release of version 20.06 of the Mercury system.

  Mercury is a modern general-purpose programming language, originally
  designed and implemented by a small group of researchers at the University


More information about the reviews mailing list