[m-dev.] bug with typeclass methods and .opt files

Julien Fischer juliensf at students.cs.mu.OZ.AU
Tue Feb 10 17:25:20 AEDT 2004


I have run across the following problem with intermodule optimization.
When building the library with `--intermod-unused-args' enabled the
compiler aborts while compiling tree234.m with the following:

ops.opt:047: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:048: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:049: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:050: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:051: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:052: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:053: Internal compiler error: unknown predicate in `pragma unused_args'.
ops.opt:054: Internal compiler error: unknown predicate in `pragma unused_args'.

The relevant lines of ops.opt are:

:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_infix_op_5'), 5, 0, [1]).
:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_operator_term_4'), 4, 0, [1]).
:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_prefix_op_4'), 4, 0, [1]).
:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_binary_prefix_op_5'), 5, 0, [1]).
:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_postfix_op_4'), 4, 0, [1]).
:- pragma unused_args(predicate, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__lookup_op_2'), 2, 0, [1]).
:- pragma unused_args(function, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__max_priority_1'), 2, 0, [1]).
:- pragma unused_args(function, (ops.'ClassMethod_for_ops__op_table____ops__mercury_op_table__arity0______ops__arg_priority_1'), 2, 0, [1]).

The immediate problem is caused by the introduced predicate for the class
method not being present in the importing module's predicate table.
Should pragmas concerning these introduced predicates be in the .opt
files anyway?  I was under the impression that they were generated afresh
for each module.

The termination analyser seems to have the same problem only it has
been cunningly avoided by commenting out the code on
lines 1630-1636 of compiler/make_hlds.m.  This results in it ignoring
pragma termination_infos for predicates that are not already in the
predicate table at the point the termination_info pragmas are read in.

Commenting out the equivalent code for the unused argument analysis
(compiler/make_hlds.m lines 1094 - 1097) fixes the problem but I
assume this is not a particularly good solution.

Is the compiler

(a) incorrect in writing out pragmas concerning the class methods
(b) incorrectly reading them in
or (c) something else?

Julien.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list