Files
mercury/tests/invalid/missing_concrete_instance.err_exp
Zoltan Somogyi 3a306a7f1f Prepare to add new warnings about instances.
Prepare for these new options, --warn-unnecessarily-private-instance and
--warn-inconsistent-instance-order, by

- moving some checks on instance declarations to a point in time
  when the set of instance declarations in the module is complete, and

- adding a new field to instance declarations to record a context needed
  for the second of the above warnings.

compiler/add_class.m
compiler/check_typeclass.m
    Move some checks on instances from add_class.m, where they have to
    work with incomplete data, to check_typeclass.m, where they have access
    to all instance declarations. The tests moved are

    - the test whether the abstract and concrete forms of an instance
      specify the same constraints or not,
    - the test for duplicate concrete instances, and
    - the test for overlapping instances.

    The new code can be, and is, much more systematic in looking for
    inconsistencies between instance declarations. For example,
    it distinguishes between duplicate and overlapping instance declarations,
    whereas the old code did not. This allows it to generate more precise
    messages.

    We do in fact generate a new warning message, for duplicate abstract
    instance declarations.

    Crucially, the new code can also gather the information needed
    for --warn-inconsistent-instance-order, although the gathered info
    is then throw away. This will change soon.

    Record phase_type_check as the phase of all the error_specs generated
    in this module, not just most of them.

    Avoid constructing doing a global traversal of the entire instance table
    when a local traversal of just the part for one class_id will do.

    Give some predicates more meaningful names.

compiler/hlds_class.m
    To check whether abstract instance declarations are in the same order
    as concrete instance declarations, check_typeclass.m needs to record,
    with each concrete instance declaration, the context of the corresponding
    abstract instance declaration (if any). Add a slot for this information.

    Change instance_id from an equivalence type to a notag type,
    to reduce the chances of values of that type being confused
    with integers whose semantics is something else.

    Document why the structure of the instance table is what it is.

compiler/base_typeclass_info.m
compiler/dead_proc_elim.m
compiler/higher_order.m
compiler/hlds_code_util.m
compiler/hlds_defns.m
compiler/hlds_out_typeclass_table.m
compiler/intermod.m
compiler/polymorphism_type_class_info.m
compiler/recompilation.usage.m
compiler/typeclasses.m
compiler/unused_imports.m
    Conform to the change in hlds_class.m.

compiler/hlds_out_util.m
    Add a utility function for use by new code in hlds_out_typeclass_table.m.

tests/invalid/incompatible_instance_constraints.err_exp
tests/invalid/missing_concrete_instance.err_exp
tests/invalid/typeclass_test_9.err_exp
    Expect updated error messages.
2022-03-19 14:41:58 +11:00

9 lines
608 B
Plaintext

missing_concrete_instance.m:014: Error: this abstract instance declaration for
missing_concrete_instance.m:014: `missing_concrete_instance.foo(int)' has no
missing_concrete_instance.m:014: corresponding concrete instance declaration
missing_concrete_instance.m:014: in the implementation section.
missing_concrete_instance.m:018: Error: this abstract instance declaration for
missing_concrete_instance.m:018: `missing_concrete_instance.foo(float)' has
missing_concrete_instance.m:018: no corresponding concrete instance
missing_concrete_instance.m:018: declaration in the implementation section.