<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 14 Nov 2024 at 09:34, Zoltan Somogyi <<a href="mailto:zoltan.somogyi@runbox.com">zoltan.somogyi@runbox.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br>
On 2024-11-13 23:41 +11:00 AEDT, "Zoltan Somogyi" <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank">zoltan.somogyi@runbox.com</a>> wrote:<br>
> > Regardless, it does<br>
>> not<br>
>> seem to be a useful behaviour *now*.<br>
> <br>
> Then I will next look into undoing it.<br>
<br>
I have now done so, with the result being the attached diff.<br>
It was much more interesting (in the Chinese curse sense)<br>
than I expected.<br>
<br>
For review by anyone. I would particularly like to know<br>
whether there is a better way to force the creation of .opt files<br>
before the compilation of their would-be consumers than the one<br>
adopted by this diff. Until now, I assumed that this was solved long ago,<br>
but apparently, this is not the case with mmake.<br></blockquote><div><br></div><div> > Don't treat .m files as substitutes for .opt files.</div>> <br>> compiler/write_deps_file.m:<br>>     When trying to check for the existence of .opt files, whether alone<br>>     or together with .trans_opt files, do not consider a .m file as<br>>     an acceptable substitute. Delete the option that can ask for this<br>>     behavior.<br><br>... <br><br>> diff --git a/tests/term/existential_error1.m b/tests/term/existential_error1.m<br>> index f336133eb..4e54b4f1b 100644<br>> --- a/tests/term/existential_error1.m<br>> +++ b/tests/term/existential_error1.m<br>> @@ -4,10 +4,39 @@<br>>  %<br>>  % Regression test for term_norm.m<br>>  % Symptom: "Software Error: Unmatched lists in functor_norm_filter_args."<br>> -% This was caused by the list of counted arguments in the weight table differing<br>> -% from the list of arguments the termination analyser provided when it called<br>> -% functor norm.  The code that constructed the weight table was ignoring<br>> -% type_infos when constructing the list of counted arguments.<br>> +% This was caused by the list of counted arguments in the weight table<br>> +% differing from the list of arguments the termination analyser provided<br>> +% when it called functor norm. The code that constructed the weight table<br>> +% was ignoring type_infos when constructing the list of counted arguments.<br>> +%<br>> +%---------------------------------------------------------------------------%<br>> +%<br>> +% This test case happens to also expose another issue about intermodule<br>> +% optimization.<br>> +%<br>> +% Whether the deconstruct_univ predicate below terminates or not is determined<br>> +% entirely by whether private_builtin.typed_unify terminates or not. However,<br>> +% private_builtin.opt and private_builtin.trans_opt in the library directory<br>> +% disagree about this: the .opt file gives typed_unify's termination status<br>> +% as can_loop, while .trans_opt gives it as cannot_loop.<br><br>That initially struck me as strange, but it is correct. Proving termination<br>of typed_unify/2 requires knowing that type_of/1 terminates and we can only<br>know that from type_desc.opt.<br>(I think the comment in compiler/termination.m above<br>set_compiler_gen_terminates/6 is wrong: it implies that the termination status<br>of *all* predicates in builtin and private_builtin is set by that code, but<br>doesn't seem to be what it actually does.)<br><br>The diff looks fine.<br><br>Julien.<br></div></div>