Commit Graph

4 Commits

Author SHA1 Message Date
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
Zoltan Somogyi
62e49667a2 Improve an error message.
compiler/add_class.m:
    As above.

tests/invalid/incompatible_instance_constraints.err_exp:
    Expect the updated error message.
2019-04-24 23:32:57 +10:00
Zoltan Somogyi
fdd141bf77 Clean up the tests in the other test directories.
tests/invalid/*.{m,err_exp}:
tests/misc_tests/*.m:
tests/mmc_make/*.m:
tests/par_conj/*.m:
tests/purity/*.m:
tests/stm/*.m:
tests/string_format/*.m:
tests/structure_reuse/*.m:
tests/submodules/*.m:
tests/tabling/*.m:
tests/term/*.m:
tests/trailing/*.m:
tests/typeclasses/*.m:
tests/valid/*.m:
tests/warnings/*.{m,exp}:
    Make these tests use four-space indentation, and ensure that
    each module is imported on its own line. (I intend to use the latter
    to figure out which subdirectories' tests can be executed in parallel.)

    These changes usually move code to different lines. For the tests
    that check compiler error messages, expect the new line numbers.

browser/cterm.m:
browser/tree234_cc.m:
    Import only one module per line.

tests/hard_coded/boyer.m:
    Fix something I missed.
2015-02-16 12:32:18 +11:00
Peter Ross
e8e1690475 The following code causes code to be generated which seg-faults
Estimated hours taken: 2
Branches: main

The following code causes code to be generated which seg-faults

 :- interface
 :- instance tc(list(T)).
 :- implementation.
 :- instance tc(list(T)) <= tc(T) where [...].

because the exported instance declaration doesn't contain the
typeclass constraint.

mercury/compiler/add_class.m:
       Check that for all the "same" instance declarations
       the instance constraints are exactly the same on each
       declaration.

tests/invalid/incompatible_instance_constraints*:
	Add tests for this code.

tests/invalid/*:
	Fix some headvar name errors.

tests/valid/*:
	Fix some invalid abstract instance declarations.
2007-05-21 04:23:26 +00:00