[m-rev.] for review: diffs for arg type lists
Julien Fischer
jfischer at opturion.com
Fri Jan 4 15:14:00 AEDT 2019
Hi Zoltan,
On Fri, 4 Jan 2019, Zoltan Somogyi wrote:
>
>
> On Thu, 3 Jan 2019 08:38:35 +0000 (UTC), Julien Fischer <jfischer at opturion.com> wrote:
>> I've just had a play around with this and there is another issue:
>>
>> :- module foo.
>> :- interface.
>>
>> :- pred q1(int::out) is det.
>>
>> :- implementation.
>>
>> q1(3, "abc").
>>
>> produces:
>>
>> foo.m:004: Error: no clauses for predicate `q1'/1.
>> foo.m:008: Error: clause for predicate `foo.q1'/2
>> foo.m:008: without corresponding `:- pred' declaration.
>> foo.m:008: However, a predicate of that name does exist with arity 1.
>> foo.m:008: Inferred :- pred q1(int, string).
>> foo.m:008: The argument list difference from the arity 1 version is
>> foo.m:008: pred(
>> foo.m:008: - int
>> foo.m:008: + int,
>> foo.m:008: + string
>> foo.m:008: )
>>
>> Here the declaration and inferred types agree on the type of the first
>> argument, so there should be no change there.
>
> There is no change in the type; there is a change in the addition of a comma,
> so the standard Unix diff program would produce this output as well.
Ah, true.
> We can either put commas between the argument types as usual and live
> with such spurious differences (which occur all the time in diffs, e.g. when
> one adds code to the end of a clause or a switch arm), or we can just list
> arg types without commas between them in this message, though this
> would look unusual in another way.
>
> A third solution would be to put a comma after the last arg type as well,
> which would be strange in a totally different way again.
>
> What do people prefer?
Leave it as-is.
...
> I am more concerned by the difference in how the old and new parts of that
> error message refer to type variables. One example:
>
> +bad_pred_arity.m:056: Inferred :- func f2(int, T2, int) = int.
> +bad_pred_arity.m:056: The argument list difference from the arity 0 version
> +bad_pred_arity.m:056: is
> +bad_pred_arity.m:056: - func = string
> +bad_pred_arity.m:056: + func(
> +bad_pred_arity.m:056: + int,
> +bad_pred_arity.m:056: + V_1,
> +bad_pred_arity.m:056: + int
> +bad_pred_arity.m:056: + ) = int
>
> The old inference message uses the tvarset of the predicate, which
> is created during the inference process, which somehow names tvar 1
> as T2 (I have no idea how, or why). The new part uses an empty tvarset,
> because using the tvarset of *either* predicate being compared would be
> confusing with respect to the other. This is why the type var is printed as V_1.
>
> Should we change the inference message to use an empty tvarset as well,
> use the tvarset of the inferred predicate or of the actually declared predicate
> we are comparing to for both parts of the message, or just keep the output
> above?
Change the inference message to use an empty tvarset as well.
Julien.
More information about the reviews
mailing list