[m-rev.] Compiler bug in conjunction with modes

Zoltan Somogyi zoltan.somogyi at runbox.com
Thu Nov 9 04:53:44 AEDT 2023


On 2023-11-09 04:15 +11:00 AEDT, "Volker Wysk" <post at volker-wysk.de> wrote:
> I think I found a compiler bug.

What you found is not a compiler bug. It is a bug in your own code.

> finally.m:027: In clause for `with_connection((pred(out, di, uo) is det),
> out,
> finally.m:027:   di, uo)':
> finally.m:027:   in call to predicate `exception.finally'/6:
> finally.m:027:   mode error: arguments
> finally.m:027:   `Pred, PRes, Cleanup, _CleanupRes, STATE_VARIABLE_IO_0,
> STATE_VARIABLE_IO'
> finally.m:027:   have the following insts:
> finally.m:027:     (pred(out, di, uo) is det),
> finally.m:027:     free,
> finally.m:027:     /* unique */ (pred(out, di, uo) is cc_multi),
> finally.m:027:     free,
> finally.m:027:     unique,
> finally.m:027:     free
> finally.m:027:   which does not match any of the modes for predicate
> finally.m:027:   `exception.finally'/6.
> 
> 
> It says that the inst of the !:IO argument is free. That's wrong, isn't it?

Why would it be wrong? The initial insts of a di/uo pair of arguments
are unique/free, as in this case.

The bug in your code is the inconsistency between the determinisms
of the Pred and Cleanup arguments: Pred is det, while Cleanup is cc_multi.
exception.finally has two modes: one required both to be det, while
the other requires both to be cc_multi. This is the bug in your code,
which the compiler is correctly reporting.

In the future, can you please be more cautious before claiming
that the compiler cannot possibly be right when it reports an error?

Zoltan.


More information about the reviews mailing list