diff --git a/compiler/comp_unit_interface.m b/compiler/comp_unit_interface.m index 173d271fd..cc2dc1e04 100644 --- a/compiler/comp_unit_interface.m +++ b/compiler/comp_unit_interface.m @@ -246,12 +246,11 @@ create_parse_tree_int3(ParseTreeModuleSrc, ParseTreeInt3) :- map.foldl(add_only_int_include, OrigInclMap, map.init, IntInclMap), IntTypeClasses = list.map(make_typeclass_abstract_for_int3, OrigIntTypeClasses), - IntInstances = list.map(make_instance_abstract, OrigIntInstances), ( - IntInstances = [], + OrigIntInstances = [], map.init(IntImportMap) ; - IntInstances = [_ | _], + OrigIntInstances = [_ | _], map.foldl(acc_int_imports, OrigImportUseMap, map.init, IntImportMap) ), map.foldl(make_type_ctor_checked_defn_abstract_for_int3, @@ -266,7 +265,7 @@ create_parse_tree_int3(ParseTreeModuleSrc, ParseTreeInt3) :- ParseTreeInt3 = parse_tree_int3(ModuleName, ModuleNameContext, IntInclMap, IntImportMap, IntTypeCtorCheckedMap, IntInstCtorCheckedMap, IntModeCtorCheckedMap, - IntTypeClasses, IntInstances, IntTypeRepnMap). + IntTypeClasses, OrigIntInstances, IntTypeRepnMap). :- pred acc_int_imports(module_name::in, maybe_implicit_import_and_or_use::in, int_import_map::in, int_import_map::out) is det. @@ -650,7 +649,7 @@ generate_pre_grab_pre_qual_interface_for_int0(ParseTreeModuleSrc, TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap, _TypeErrSpecs, _TypeWarnSpecs, _InstModeErrSpecs, _InstModeWarnSpecs, - IntTypeClasses, IntInstances0, IntPredDecls, IntModeDecls, + IntTypeClasses, AbsIntInstances0, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, _IntBadClausePreds, ImpTypeClasses, ImpInstances0, ImpPredDecls, ImpModeDecls, @@ -662,15 +661,14 @@ generate_pre_grab_pre_qual_interface_for_int0(ParseTreeModuleSrc, % Delete from the implementation section any abstract instances % that would duplicate one in the interface section. OutInfo = init_write_int_merc_out_info, - IntAbsInstances0 = list.map(make_instance_abstract, IntInstances0), - IntAbsInstanceStrs = - list.map(item_abstract_instance_to_string(OutInfo), IntAbsInstances0), - set_tree234.list_to_set(IntAbsInstanceStrs, IntAbsInstanceStrSet), + AbsIntInstanceStrs = + list.map(item_abstract_instance_to_string(OutInfo), AbsIntInstances0), + set_tree234.list_to_set(AbsIntInstanceStrs, AbsIntInstanceStrSet), ImpAbsInstances1 = list.map(make_instance_abstract, ImpInstances0), KeepImpAbsInstanceTest = - ( pred(AbsInstance::in) is semidet :- - Str = item_abstract_instance_to_string(OutInfo, AbsInstance), - not set_tree234.contains(IntAbsInstanceStrSet, Str) + ( pred(AbsIntInstance::in) is semidet :- + Str = item_abstract_instance_to_string(OutInfo, AbsIntInstance), + not set_tree234.contains(AbsIntInstanceStrSet, Str) ), list.filter(KeepImpAbsInstanceTest, ImpAbsInstances1, ImpAbsInstances0), @@ -681,7 +679,7 @@ generate_pre_grab_pre_qual_interface_for_int0(ParseTreeModuleSrc, TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap, [], [], [], [], - IntTypeClasses, coerce(IntAbsInstances0), IntPredDecls, IntModeDecls, + IntTypeClasses, AbsIntInstances0, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, set.init, ImpTypeClasses, coerce(ImpAbsInstances0), ImpPredDecls, ImpModeDecls, @@ -717,7 +715,7 @@ create_parse_tree_int0(AugMakeIntUnit, ParseTreeInt0) :- TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap, _TypeErrSpecs, _TypeWarnSpecs, _InstModeErrSpecs, _InstModeWarnSpecs, - IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls, + IntTypeClasses, AbsIntInstances, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, _IntBadClausePreds, ImpTypeClasses, ImpInstances, ImpPredDecls0, ImpModeDecls, @@ -740,7 +738,6 @@ create_parse_tree_int0(AugMakeIntUnit, ParseTreeInt0) :- % Make the implementation FIMs disjoint from the interface FIMs. set.difference(ImpFIMSpecs1, IntFIMSpecs, ImpFIMSpecs), - IntAbsInstances = list.map(check_instance_is_abstract, IntInstances), ImpAbsInstances = list.map(check_instance_is_abstract, ImpInstances), ImpPredDecls = ImpPredDecls0 ++ list.condense( @@ -750,7 +747,7 @@ create_parse_tree_int0(AugMakeIntUnit, ParseTreeInt0) :- MaybeVersionNumbers, InclMap, SectionImportUseMap, IntFIMSpecs, ImpFIMSpecs, TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap, - IntTypeClasses, IntAbsInstances, IntPredDecls, IntModeDecls, + IntTypeClasses, AbsIntInstances, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, ImpTypeClasses, ImpAbsInstances, ImpPredDecls, ImpModeDecls, ImpDeclPragmas, ImpDeclMarkers, ImpPromises). @@ -901,7 +898,6 @@ generate_pre_grab_pre_qual_interface_for_int1_int2(ParseTreeModuleSrc, _ImpDeclPragmas, _ImpDeclMarkers, _ImpImplPragmas, _ImpImplMarkers, _ImpPromises, _ImpInitialises, _ImpFinalises, _ImpMutables), - IntInstancesAbstract = list.map(make_instance_abstract, IntInstances), map.map_values_only(pre_grab_pre_qual_type_ctor_checked_defn, TypeCtorCheckedMap, IntTypeCtorCheckedMap), map.foldl(pre_grab_pre_qual_inst_ctor_checked_defn, @@ -917,7 +913,7 @@ generate_pre_grab_pre_qual_interface_for_int1_int2(ParseTreeModuleSrc, IntTypeCtorCheckedMap, IntInstCtorCheckedMap, IntModeCtorCheckedMap, TypeErrSpecs, TypeWarnSpecs, InstModeErrSpecs, InstModeWarnSpecs, - IntTypeClasses, coerce(IntInstancesAbstract), + IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, IntBadClausePreds, @@ -1293,7 +1289,6 @@ create_parse_tree_int1(Globals, AugMakeIntUnit, !:Specs = coerce(RepnSpecs) ++ !.Specs ), - IntInstances = list.map(check_instance_is_abstract, IntInstances0), list.filter(keep_promise_item_int, IntPromises0, IntPromises), DummyMaybeVersionNumbers = no_version_numbers, @@ -1302,7 +1297,7 @@ create_parse_tree_int1(Globals, AugMakeIntUnit, DummyMaybeVersionNumbers, InclMap, SectionUseOnlyMap, IntFIMSpecs, ImpFIMSpecs, IntTypeCtorCheckedMap, IntInstCtorCheckedMap, IntModeCtorCheckedMap, - IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls, + IntTypeClasses, IntInstances0, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, TypeCtorRepnMap, ImpTypeClasses). @@ -2897,7 +2892,8 @@ get_int2_items_from_int1_int_typeclass([TypeClassInfo | TypeClassInfos], get_int2_items_from_int1_int_typeclass(TypeClassInfos, !MaybeUnqual, !ModuleNames, !IntTypeClassesCord). -:- pred get_int2_items_from_int1_int_instance(list(item_instance_info)::in, +:- pred get_int2_items_from_int1_int_instance( + list(item_abstract_instance_info)::in, maybe_unqual_symnames::in, maybe_unqual_symnames::out, set(module_name)::in, set(module_name)::out, cord(item_abstract_instance_info)::in, @@ -2908,10 +2904,8 @@ get_int2_items_from_int1_int_instance([], get_int2_items_from_int1_int_instance([InstanceInfo | InstanceInfos], !MaybeUnqual, !ModuleNames, !IntInstancesCord) :- InstanceInfo = item_instance_info(ClassSymName, - ArgTypes, OrigArgTypes, ClassConstraints, InstanceBody0, + ArgTypes, OrigArgTypes, ClassConstraints, _InstanceBody0, TVarSet, ContainingModuleName, Context, SeqNum), - expect(unify(InstanceBody0, instance_body_abstract), $pred, - "instance_body_abstract"), accumulate_module(ClassSymName, !MaybeUnqual, !ModuleNames), accumulate_modules_in_types(ArgTypes, !MaybeUnqual, !ModuleNames), accumulate_modules_in_types(OrigArgTypes, !MaybeUnqual, !ModuleNames), diff --git a/compiler/convert_parse_tree.m b/compiler/convert_parse_tree.m index 38ad24012..5083c0868 100644 --- a/compiler/convert_parse_tree.m +++ b/compiler/convert_parse_tree.m @@ -1544,14 +1544,9 @@ check_convert_raw_comp_unit_to_module_src(Globals, RawCompUnit, list.reverse(RevImpFinalises0, ImpFinalises0), list.reverse(RevImpMutables0, ImpMutables0), - ( if map.is_empty(InclMap) then - IntInstances = IntInstances0, - ImpInstances = ImpInstances0 - else - split_concrete_int_instances(IntInstances0, - IntInstances, MovedImpInstances), - ImpInstances = MovedImpInstances ++ ImpInstances0 - ), + split_concrete_int_instances(IntInstances0, + AbsIntInstances, MovedImpInstances), + ImpInstances = MovedImpInstances ++ ImpInstances0, IntTypeDefnMap = type_ctor_defn_items_to_map(IntTypeDefns), ImpTypeDefnMap = type_ctor_defn_items_to_map(ImpTypeDefns), @@ -1613,7 +1608,7 @@ check_convert_raw_comp_unit_to_module_src(Globals, RawCompUnit, TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap, TypeErrSpecs, TypeWarnSpecs, InstModeErrSpecs, InstModeWarnSpecs, - IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls, + IntTypeClasses, AbsIntInstances, IntPredDecls, IntModeDecls, IntDeclPragmas, IntDeclMarkers, IntPromises, IntBadClausePreds, ImpTypeClasses, ImpInstances, ImpPredDecls, ImpModeDecls, @@ -1632,7 +1627,8 @@ check_convert_raw_comp_unit_to_module_src(Globals, RawCompUnit, % nice to know just *why* this needs to be done. % :- pred split_concrete_int_instances(list(item_instance_info)::in, - list(item_instance_info)::out, list(item_instance_info)::out) is det. + list(item_abstract_instance_info)::out, list(item_instance_info)::out) + is det. split_concrete_int_instances(IntInstances0, IntInstances, ImpInstances) :- split_concrete_int_instances_acc(IntInstances0, @@ -1641,27 +1637,34 @@ split_concrete_int_instances(IntInstances0, IntInstances, ImpInstances) :- ImpInstances = cord.list(ImpInstanceCord). :- pred split_concrete_int_instances_acc(list(item_instance_info)::in, - cord(item_instance_info)::in, cord(item_instance_info)::out, + cord(item_abstract_instance_info)::in, + cord(item_abstract_instance_info)::out, cord(item_instance_info)::in, cord(item_instance_info)::out) is det. split_concrete_int_instances_acc([], - !IntInstanceCord, !ImpInstanceCord). + !AbsIntInstanceCord, !ImpInstanceCord). split_concrete_int_instances_acc([IntInstance | IntInstances], - !IntInstanceCord, !ImpInstanceCord) :- - Body = IntInstance ^ ci_method_instances, + !AbsIntInstanceCord, !ImpInstanceCord) :- + IntInstance = item_instance_info(ClassName, Types, OrigTypes, + DerivingClass, Body0, TVarSet, ContainingModule, Context, SeqNum), + % NOTE: Due to the lack of alias tracking, testing the value of a field + % does NOT update the compiler's knowledge of the term that the field + % came from. We have to rebuild the term to tell the compiler + % about AbsIntInstance being an item_abstract_instance_info. + Body = instance_body_abstract, + AbsIntInstance = item_instance_info(ClassName, Types, OrigTypes, + DerivingClass, Body, TVarSet, ContainingModule, Context, SeqNum), ( - Body = instance_body_concrete(_), - AbstractIntInstance = - IntInstance ^ ci_method_instances := instance_body_abstract, - cord.snoc(AbstractIntInstance, !IntInstanceCord), + Body0 = instance_body_concrete(_), + cord.snoc(AbsIntInstance, !AbsIntInstanceCord), cord.snoc(IntInstance, !ImpInstanceCord) ; - Body = instance_body_abstract, + Body0 = instance_body_abstract, % Do not put another copy of this item into !ImpInstanceCord. - cord.snoc(IntInstance, !IntInstanceCord) + cord.snoc(AbsIntInstance, !AbsIntInstanceCord) ), split_concrete_int_instances_acc(IntInstances, - !IntInstanceCord, !ImpInstanceCord). + !AbsIntInstanceCord, !ImpInstanceCord). %---------------------------------------------------------------------------% diff --git a/compiler/equiv_type_parse_tree.m b/compiler/equiv_type_parse_tree.m index db536458c..ad9889c1e 100644 --- a/compiler/equiv_type_parse_tree.m +++ b/compiler/equiv_type_parse_tree.m @@ -252,7 +252,7 @@ replace_in_parse_tree_module_src(Params, replace_in_typeclass_info, IntTypeClasses0, IntTypeClasses, !RecompInfo, !UsedModules, !Specs), replace_in_list(Params, MaybeRecordInt, - replace_in_instance_info, IntInstances0, IntInstances, + replace_in_abstract_instance_info, IntInstances0, IntInstances, !RecompInfo, !UsedModules, !Specs), replace_in_list(Params, MaybeRecordInt, replace_in_pred_decl_info, IntPredDecls0, IntPredDecls, diff --git a/compiler/get_dependencies.m b/compiler/get_dependencies.m index 9dca70658..302147700 100644 --- a/compiler/get_dependencies.m +++ b/compiler/get_dependencies.m @@ -369,7 +369,7 @@ acc_implicit_avail_needs_in_parse_tree_module_src(ParseTreeModuleSrc, % *declared* in interface sections. Therefore calling that predicate % on _IntTypeDefns would do nothing. list.foldl(acc_implicit_avail_needs_in_instance, - IntInstances, !ImplicitAvailNeeds), + coerce(IntInstances), !ImplicitAvailNeeds), list.foldl(acc_implicit_avail_needs_in_promise, IntPromises, !ImplicitAvailNeeds), diff --git a/compiler/make_hlds_passes.m b/compiler/make_hlds_passes.m index d4663cdd3..5bce1f6ff 100644 --- a/compiler/make_hlds_passes.m +++ b/compiler/make_hlds_passes.m @@ -203,7 +203,8 @@ parse_tree_to_hlds(ProgressStream, AugCompUnit, Globals, DumpBaseFileName, separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs, TypeDefnsAbstract, TypeDefnsMercury, TypeDefnsForeign, InstDefns, ModeDefns, PredDecls, ModeDecls, - Promises, Typeclasses, Instances, Initialises, Finalises, Mutables, + Promises, Typeclasses, IntInstances, ImpInstances, + Initialises, Finalises, Mutables, TypeRepnMap, ForeignEnums, ForeignExportEnums, DeclPragmas, DeclMarkers, DeclTypeSpecConstr, DeclTypeSpec, DeclTermination, DeclTermination2, DeclSharing, DeclReuse, @@ -439,7 +440,9 @@ parse_tree_to_hlds(ProgressStream, AugCompUnit, Globals, DumpBaseFileName, % The items in MutablePredDecls do not have default modes to add. % Record instance definitions. - add_instance_defns(Instances, + add_instance_defns(coerce(IntInstances), + !ModuleInfo, !ErrSpecs), + add_instance_defns(ImpInstances, !ModuleInfo, !ErrSpecs), % Implement several kinds of pragmas, the ones in the subtype diff --git a/compiler/make_hlds_separate_items.m b/compiler/make_hlds_separate_items.m index b74cd1f71..c24b072ca 100644 --- a/compiler/make_hlds_separate_items.m +++ b/compiler/make_hlds_separate_items.m @@ -75,6 +75,7 @@ ims_list(item_mode_decl_info)::out, ims_list(item_promise_info)::out, sec_list(item_typeclass_info)::out, + ims_list(item_abstract_instance_info)::out, ims_list(item_instance_info)::out, ims_list(item_initialise_info)::out, ims_list(item_finalise_info)::out, @@ -137,7 +138,8 @@ ia_inst_defns :: ims_cord(item_inst_defn_info), ia_mode_defns :: ims_cord(item_mode_defn_info), ia_typeclasses :: sec_cord(item_typeclass_info), - ia_instances :: ims_cord(item_instance_info), + ia_int_instances :: ims_cord(item_abstract_instance_info), + ia_imp_instances :: ims_cord(item_instance_info), ia_pred_decls :: sec_cord(item_pred_decl_info), ia_mode_decls :: ims_cord(item_mode_decl_info), ia_clauses :: ims_cord(item_clause_info), @@ -169,7 +171,7 @@ separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs, TypeDefnsAbstract, TypeDefnsMercury, TypeDefnsForeign, InstDefns, ModeDefns, PredDecls, ModeDecls, - Promises, TypeClasses, Instances, + Promises, TypeClasses, IntInstances, ImpInstances, Initialises, Finalises, Mutables, TypeRepnMap, ForeignEnums, ForeignExportEnums, DeclPragmas, DeclMarkers, @@ -193,7 +195,7 @@ separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs, !:Acc = item_accumulator(cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, - cord.init, cord.init, cord.init, cord.init, + cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, cord.init, @@ -239,7 +241,8 @@ separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs, map.foldl_values(acc_type_repn_spec, TypeRepnSpecs, !Acc), !.Acc = item_accumulator(AvailsCord, FIMsCord, TypeDefnsAbstractCord, TypeDefnsMercuryCord, TypeDefnsForeignCord, - InstDefnsCord, ModeDefnsCord, TypeClassesCord, InstancesCord, + InstDefnsCord, ModeDefnsCord, + TypeClassesCord, IntInstancesCord, ImpInstancesCord, PredDeclsCord, ModeDeclsCord, ClausesCord, ForeignProcsCord, ForeignEnumsCord, ForeignExportEnumsCord, @@ -263,7 +266,8 @@ separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs, InstDefns = cord.list(InstDefnsCord), ModeDefns = cord.list(ModeDefnsCord), TypeClasses = cord.list(TypeClassesCord), - Instances = cord.list(InstancesCord), + IntInstances = cord.list(IntInstancesCord), + ImpInstances = cord.list(ImpInstancesCord), PredDecls = cord.list(PredDeclsCord), ModeDecls = cord.list(ModeDeclsCord), Clauses = cord.list(ClausesCord), @@ -438,7 +442,8 @@ acc_parse_tree_module_src(ParseTreeModuleSrc, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -493,9 +498,9 @@ acc_parse_tree_module_src(ParseTreeModuleSrc, !Acc) :- acc_sec_list(SubSectionInfo, SubTypeClasses, AccTypeClasses1, AccTypeClasses), acc_ims_list(IntItemMercuryStatus, IntInstances, - AccInstances0, AccInstances1), + AccIntInstances0, AccIntInstances), acc_ims_list(SubItemMercuryStatus, SubInstances, - AccInstances1, AccInstances), + AccImpInstances0, AccImpInstances), acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls1), acc_sec_list(SubSectionInfo, SubPredDecls, AccPredDecls1, AccPredDecls), acc_ims_list(IntItemMercuryStatus, IntModeDecls, @@ -534,7 +539,8 @@ acc_parse_tree_module_src(ParseTreeModuleSrc, !Acc) :- !:Acc = item_accumulator(AccAvails, AccFIMs, AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor, - AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances, + AccInstDefns, AccModeDefns, + AccTypeClasses, AccIntInstances, AccImpInstances, AccPredDecls, AccModeDecls, AccClauses, AccForeignProcs, AccForeignEnums, AccForeignExportEnums, AccDeclPragmas, AccDeclMarkers, @@ -583,7 +589,8 @@ acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -637,10 +644,10 @@ acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc) :- AccTypeClasses0, AccTypeClasses1), acc_sec_list(ImpSectionInfo, ImpTypeClasses, AccTypeClasses1, AccTypeClasses), - acc_ims_list(IntItemMercuryStatus, coerce(IntInstances), - AccInstances0, AccInstances1), + acc_ims_list(IntItemMercuryStatus, IntInstances, + AccIntInstances0, AccIntInstances), acc_ims_list(ImpItemMercuryStatus, coerce(ImpInstances), - AccInstances1, AccInstances), + AccImpInstances0, AccImpInstances), acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls1), acc_sec_list(ImpSectionInfo, ImpPredDecls, AccPredDecls1, AccPredDecls), acc_ims_list(IntItemMercuryStatus, IntModeDecls, @@ -664,7 +671,8 @@ acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc) :- !:Acc = item_accumulator(AccAvails, AccFIMs, AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor, - AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances, + AccInstDefns, AccModeDefns, + AccTypeClasses, AccIntInstances, AccImpInstances, AccPredDecls, AccModeDecls, AccClauses0, AccForeignProcs0, AccForeignEnums, AccForeignExportEnums0, AccDeclPragmas, AccDeclMarkers, @@ -752,7 +760,8 @@ acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -801,8 +810,8 @@ acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc) :- AccTypeClasses0, AccTypeClasses1), acc_sec_list(ImpSectionInfo, coerce(ImpTypeClasses), AccTypeClasses1, AccTypeClasses), - acc_ims_list(IntItemMercuryStatus, coerce(IntInstances), - AccInstances0, AccInstances), + acc_ims_list(IntItemMercuryStatus, IntInstances, + AccIntInstances0, AccIntInstances), acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls), acc_ims_list(IntItemMercuryStatus, IntModeDecls, AccModeDecls0, AccModeDecls), @@ -818,7 +827,8 @@ acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc) :- !:Acc = item_accumulator(AccAvails, AccFIMs, AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor, - AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances, + AccInstDefns, AccModeDefns, + AccTypeClasses, AccIntInstances, AccImpInstances0, AccPredDecls, AccModeDecls, AccClauses0, AccForeignProcs0, AccForeignEnums, AccForeignExportEnums0, AccDeclPragmas, AccDeclMarkers, @@ -870,7 +880,8 @@ acc_parse_tree_int2(ParseTreeInt2, ReadWhy2, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -917,14 +928,15 @@ acc_parse_tree_int2(ParseTreeInt2, ReadWhy2, !Acc) :- AccModeDefns0, AccModeDefns), acc_sec_list(IntSectionInfo, IntTypeClasses, AccTypeClasses0, AccTypeClasses), - acc_ims_list(IntItemMercuryStatus, coerce(IntInstances), - AccInstances0, AccInstances), + acc_ims_list(IntItemMercuryStatus, IntInstances, + AccIntInstances0, AccIntInstances), AccTypeRepns = [ModuleName - int_type_ctor_repns(ifk_int2, IntTypeRepnMap) | AccTypeRepns0], !:Acc = item_accumulator(AccAvails, AccFIMs, AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor, - AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances, + AccInstDefns, AccModeDefns, + AccTypeClasses, AccIntInstances, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -955,7 +967,8 @@ acc_parse_tree_plain_opt(ParseTreePlainOpt, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -983,7 +996,8 @@ acc_parse_tree_plain_opt(ParseTreePlainOpt, !Acc) :- acc_ims_list(ItemMercuryStatus, InstDefns, AccInstDefns0, AccInstDefns), acc_ims_list(ItemMercuryStatus, ModeDefns, AccModeDefns0, AccModeDefns), acc_sec_list(SectionInfo, TypeClasses, AccTypeClasses0, AccTypeClasses), - acc_ims_list(ItemMercuryStatus, Instances, AccInstances0, AccInstances), + acc_ims_list(ItemMercuryStatus, Instances, + AccImpInstances0, AccImpInstances), acc_sec_list(SectionInfo, PredDecls, AccPredDecls0, AccPredDecls), acc_ims_list(ItemMercuryStatus, ModeDecls, AccModeDecls0, AccModeDecls), acc_ims_list(ItemMercuryStatus, Clauses, AccClauses0, AccClauses), @@ -1017,7 +1031,8 @@ acc_parse_tree_plain_opt(ParseTreePlainOpt, !Acc) :- !:Acc = item_accumulator(AccAvails, AccFIMs, AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor, - AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances, + AccInstDefns, AccModeDefns, + AccTypeClasses, AccIntInstances0, AccImpInstances, AccPredDecls, AccModeDecls, AccClauses, AccForeignProcs, AccForeignEnums, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers, @@ -1042,7 +1057,8 @@ acc_parse_tree_trans_opt(ParseTreeTransOpt, !Acc) :- !.Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, @@ -1072,7 +1088,8 @@ acc_parse_tree_trans_opt(ParseTreeTransOpt, !Acc) :- !:Acc = item_accumulator(AccAvails0, AccFIMs0, AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0, - AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0, + AccInstDefns0, AccModeDefns0, + AccTypeClasses0, AccIntInstances0, AccImpInstances0, AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0, AccForeignEnums0, AccForeignExportEnums0, AccDeclPragmas0, AccDeclMarkers0, diff --git a/compiler/module_qual.collect_mq_info.m b/compiler/module_qual.collect_mq_info.m index 55f763200..0ffef14c7 100644 --- a/compiler/module_qual.collect_mq_info.m +++ b/compiler/module_qual.collect_mq_info.m @@ -131,7 +131,7 @@ collect_mq_info_in_parse_tree_module_src(ParseTreeModuleSrc, !Info) :- IntTypeClasses, !Info), list.foldl(collect_mq_info_in_item_typeclass(ImpPermissions), ImpTypeClasses, !Info), - list.foldl(collect_mq_info_in_item_instance, IntInstances, !Info), + list.foldl(collect_mq_info_in_item_instance, coerce(IntInstances), !Info), list.foldl(collect_mq_info_in_item_instance, ImpInstances, !Info), list.foldl(collect_mq_info_in_item_promise(mq_used_in_interface), IntPromises, !Info), diff --git a/compiler/module_qual.qualify_items.m b/compiler/module_qual.qualify_items.m index 3276e207d..d39a44824 100644 --- a/compiler/module_qual.qualify_items.m +++ b/compiler/module_qual.qualify_items.m @@ -308,7 +308,7 @@ qualify_parse_tree_module_src(ParseTreeModuleSrc0, ParseTreeModuleSrc, InInt = mq_used_in_interface, list.map_foldl(module_qualify_item_typeclass(InInt), IntTypeClasses0, IntTypeClasses, !Info), - list.map_foldl(module_qualify_item_instance(InInt), + list.map_foldl(module_qualify_item_abstract_instance(InInt), IntInstances0, IntInstances, !Info), list.map_foldl(module_qualify_item_pred_decl(InInt), IntPredDecls0, IntPredDecls, !Info), diff --git a/compiler/parse_tree_out.m b/compiler/parse_tree_out.m index 4efcec08d..271d50ee0 100644 --- a/compiler/parse_tree_out.m +++ b/compiler/parse_tree_out.m @@ -384,7 +384,7 @@ mercury_format_parse_tree_module_src(Info, S, ParseTreeModuleSrc, !U) :- list.foldl(mercury_format_item_typeclass(Info, S), IntTypeClasses, !U), list.foldl(mercury_format_item_instance(Info, S), - IntInstances, !U), + coerce(IntInstances), !U), list.foldl( mercury_format_item_pred_decl_mu_mc(Info, print_name_only, S), IntPredDecls, !U), diff --git a/compiler/prog_parse_tree.m b/compiler/prog_parse_tree.m index c041045e9..9536a065a 100644 --- a/compiler/prog_parse_tree.m +++ b/compiler/prog_parse_tree.m @@ -329,7 +329,7 @@ % twice, once in each section, so we treat them as only % being in the interface.) ptms_int_typeclasses :: list(item_typeclass_info), - ptms_int_instances :: list(item_instance_info), + ptms_int_instances :: list(item_abstract_instance_info), ptms_int_pred_decls :: list(item_pred_decl_info), ptms_int_mode_decls :: list(item_mode_decl_info), ptms_int_decl_pragmas :: list(item_decl_pragma_info), @@ -436,7 +436,7 @@ % interface or implementation section. We should make that % distinction here ONLY when we have to. pti0_int_typeclasses :: list(item_typeclass_info), - pti0_int_instances :: list(item_abstract_instance_info), + pti0_int_instances :: list(item_abstract_instance_info), pti0_int_pred_decls :: list(item_pred_decl_info), pti0_int_mode_decls :: list(item_mode_decl_info), pti0_int_decl_pragmas :: list(item_decl_pragma_info), @@ -445,7 +445,7 @@ % Items of various kinds in the implementation section. pti0_imp_typeclasses :: list(item_typeclass_info), - pti0_imp_instances :: list(item_abstract_instance_info), + pti0_imp_instances :: list(item_abstract_instance_info), pti0_imp_pred_decls :: list(item_pred_decl_info), pti0_imp_mode_decls :: list(item_mode_decl_info), pti0_imp_decl_pragmas :: list(item_decl_pragma_info), diff --git a/tests/invalid/instances_pc.instances_pc_helper_1.err_exp3 b/tests/invalid/instances_pc.instances_pc_helper_1.err_exp3 new file mode 100644 index 000000000..8830b6489 --- /dev/null +++ b/tests/invalid/instances_pc.instances_pc_helper_1.err_exp3 @@ -0,0 +1,5 @@ +instances_pc.instances_pc_helper_1.m:019: Error: inconsistent instance +instances_pc.instances_pc_helper_1.m:019: declaration for typeclass +instances_pc.instances_pc_helper_1.m:019: `instances_pc.foo'/2 with +instances_pc.instances_pc_helper_1.m:019: functional dependency `(A -> B)'. +instances_pc.int0:005: Here is the conflicting instance. diff --git a/tests/invalid/instances_pc.instances_pc_helper_1.err_exp4 b/tests/invalid/instances_pc.instances_pc_helper_1.err_exp4 new file mode 100644 index 000000000..a3a66ff08 --- /dev/null +++ b/tests/invalid/instances_pc.instances_pc_helper_1.err_exp4 @@ -0,0 +1,5 @@ +instances_pc.instances_pc_helper_1.m:019: Error: inconsistent instance +instances_pc.instances_pc_helper_1.m:019: declaration for typeclass +instances_pc.instances_pc_helper_1.m:019: `instances_pc.foo'/2 with +instances_pc.instances_pc_helper_1.m:019: functional dependency `(A -> B)'. +Mercury/int0s/instances_pc.int0:005: Here is the conflicting instance.