diff --git a/NEWS b/NEWS index 169db4a05..0917242b3 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,11 @@ Changes to the Mercury standard library: * We have added string.c_pointer_to_string/{1,2} and string.from_c_pointer/1 to convert c_pointers to a human readable form. +* We have changed term.variable so that it records the context where + the variable was used. This required the backward mode of + term.var_list_to_term_list to be removed. The backwards mode is + now accessed via term.term_list_to_var_list. + * We have renamed some library predicates whose names were ambiguous. Changes to the Mercury compiler: diff --git a/compiler/add_clause.m b/compiler/add_clause.m index 4c83a9b22..5d37e750c 100644 --- a/compiler/add_clause.m +++ b/compiler/add_clause.m @@ -132,7 +132,7 @@ module_add_clause(ClauseVarSet, PredOrFunc, PredName, Args0, Body, Status, ( GoalType = goal_type_promise(_) -> - term.term_list_to_var_list(Args, HeadVars), + HeadVars = term.term_list_to_var_list(Args), preds_add_implicit_for_assertion(HeadVars, !.ModuleInfo, ModuleName, PredName, Arity, Status, Context, PredOrFunc, PredId, !PredicateTable), @@ -868,11 +868,11 @@ transform_goal_2(unify_expr(A0, B0, Purity), Context, Subst, Goal, NumAdded, !VarSet, !ModuleInfo, !QualInfo, !SInfo, !Specs) :- % It is an error for the left or right hand side of a % unification to be !X (it may be !.X or !:X, however). - ( A0 = functor(atom("!"), [variable(StateVarA)], _) -> + ( A0 = functor(atom("!"), [variable(StateVarA, _)], _) -> report_svar_unify_error(Context, !.VarSet, StateVarA, !Specs), Goal = true_goal, NumAdded = 0 - ; B0 = functor(atom("!"), [variable(StateVarB)], _) -> + ; B0 = functor(atom("!"), [variable(StateVarB, _)], _) -> report_svar_unify_error(Context, !.VarSet, StateVarB, !Specs), Goal = true_goal, NumAdded = 0 @@ -896,8 +896,8 @@ extract_trace_mutable_var(Context, VarSet, Mutable, MutableHLDS, StateVar, MutableHLDS = trace_mutable_var_hlds(MutableName, StateVarName), GetPredName = unqualified("get_" ++ MutableName), SetPredName = unqualified("set_" ++ MutableName), - SetVar = functor(atom("!:"), [variable(StateVar)], Context), - UseVar = functor(atom("!."), [variable(StateVar)], Context), + SetVar = functor(atom("!:"), [variable(StateVar, Context)], Context), + UseVar = functor(atom("!."), [variable(StateVar, Context)], Context), GetPurity = purity_semipure, SetPurity = purity_impure, GetGoal = call_expr(GetPredName, [SetVar], GetPurity) - Context, @@ -910,8 +910,8 @@ extract_trace_io_var(Context, StateVar, GetGoal, SetGoal) :- Builtin = mercury_private_builtin_module, GetPredName = qualified(Builtin, "trace_get_io_state"), SetPredName = qualified(Builtin, "trace_set_io_state"), - SetVar = functor(atom("!:"), [variable(StateVar)], Context), - UseVar = functor(atom("!."), [variable(StateVar)], Context), + SetVar = functor(atom("!:"), [variable(StateVar, Context)], Context), + UseVar = functor(atom("!."), [variable(StateVar, Context)], Context), GetPurity = purity_semipure, SetPurity = purity_impure, GetGoal = call_expr(GetPredName, [SetVar], GetPurity) - Context, diff --git a/compiler/add_type.m b/compiler/add_type.m index df24ed327..af95ef702 100644 --- a/compiler/add_type.m +++ b/compiler/add_type.m @@ -678,9 +678,9 @@ convert_type_defn(parse_tree_foreign_type(ForeignType, MaybeUserEqComp, list(error_spec)::in, list(error_spec)::out) is det. ctors_add([], _, _, _, _, _, _, !FieldNameTable, !Ctors, !Specs). -ctors_add([Ctor | Rest], TypeCtor, TVarSet, NeedQual, PQInfo, Context, +ctors_add([Ctor | Rest], TypeCtor, TVarSet, NeedQual, PQInfo, _Context, ImportStatus, !FieldNameTable, !Ctors, !Specs) :- - Ctor = ctor(ExistQVars, Constraints, Name, Args), + Ctor = ctor(ExistQVars, Constraints, Name, Args, Context), QualifiedConsId = make_cons_id(Name, Args, TypeCtor), ConsDefn = hlds_cons_defn(ExistQVars, Constraints, Args, TypeCtor, Context), @@ -727,7 +727,8 @@ ctors_add([Ctor | Rest], TypeCtor, TVarSet, NeedQual, PQInfo, Context, list.map_foldl(add_ctor(ConsName, Arity, ConsDefn), PartialQuals, _PartiallyQualifiedConsIds, !Ctors), - assoc_list.keys(Args, FieldNames), + FieldNames = list.map(func(C) = C ^ arg_field_name, Args), + FirstField = 1, add_ctor_field_names(FieldNames, NeedQual, PartialQuals, TypeCtor, diff --git a/compiler/check_hlds.m b/compiler/check_hlds.m index 7cb2a08a2..27b155f6d 100644 --- a/compiler/check_hlds.m +++ b/compiler/check_hlds.m @@ -79,6 +79,9 @@ % Warnings about unused imports :- include_module unused_imports. +% Output XML representation useful for documentation of module +:- include_module xml_documentation. + :- include_module goal_path. %-----------------------------------------------------------------------------% diff --git a/compiler/check_typeclass.m b/compiler/check_typeclass.m index 8d9d01aee..f282edf46 100644 --- a/compiler/check_typeclass.m +++ b/compiler/check_typeclass.m @@ -1297,8 +1297,8 @@ check_ctor_constraints(TypeTable, TypeCtor, !ModuleInfo, !Specs) :- list(error_spec)::in, list(error_spec)::out) is det. check_ctor_type_ambiguities(TypeCtor, TypeDefn, Ctor, !ModuleInfo, !Specs) :- - Ctor = ctor(ExistQVars, Constraints, _, CtorArgs), - assoc_list.values(CtorArgs, ArgTypes), + Ctor = ctor(ExistQVars, Constraints, _, CtorArgs, _), + ArgTypes = list.map(func(ctor_arg(_, T, _)) = T, CtorArgs), type_vars_list(ArgTypes, ArgTVars), list.filter((pred(V::in) is semidet :- list.member(V, ExistQVars)), ArgTVars, ExistQArgTVars), diff --git a/compiler/det_util.m b/compiler/det_util.m index 6bb728201..a7fd9f0e8 100644 --- a/compiler/det_util.m +++ b/compiler/det_util.m @@ -114,11 +114,11 @@ delete_unreachable_cases([Case | Cases0], [ConsId | ConsIds], Cases) :- ). interpret_unify(X, rhs_var(Y), !Subst) :- - unify_term(variable(X), variable(Y), !Subst). + unify_term(variable(X, context_init), variable(Y, context_init), !Subst). interpret_unify(X, rhs_functor(ConsId, _, ArgVars), !Subst) :- term.var_list_to_term_list(ArgVars, ArgTerms), cons_id_and_args_to_term(ConsId, ArgTerms, RhsTerm), - unify_term(variable(X), RhsTerm, !Subst). + unify_term(variable(X, context_init), RhsTerm, !Subst). interpret_unify(_X, rhs_lambda_goal(_, _, _, _, _, _, _, _), !Subst). % For ease of implementation we just ignore unifications with lambda terms. % This is a safe approximation, it just prevents us from optimizing them diff --git a/compiler/equiv_type.m b/compiler/equiv_type.m index 5ad77c0e1..17be18f5a 100644 --- a/compiler/equiv_type.m +++ b/compiler/equiv_type.m @@ -667,8 +667,8 @@ replace_in_ctors_location(Location, EqvMap, !Ctors, !VarSet, !Info, used_modules::in, used_modules::out) is det. replace_in_ctor(Location, EqvMap, - ctor(ExistQVars, Constraints0, TName, Targs0), - ctor(ExistQVars, Constraints, TName, Targs), + ctor(ExistQVars, Constraints0, TName, Targs0, Ctxt), + ctor(ExistQVars, Constraints, TName, Targs, Ctxt), !VarSet, !Info, !UsedModules) :- replace_in_ctor_arg_list(Location, EqvMap, Targs0, Targs, _, !VarSet, !Info, !UsedModules), @@ -751,8 +751,8 @@ replace_in_ctor_arg_list(Location, replace_in_ctor_arg_list_2(_Location, _EqvMap, _Seen, [], [], !Circ, !VarSet, !Info, !UsedModules). -replace_in_ctor_arg_list_2(Location, - EqvMap, Seen, [N - T0 | As0], [N - T | As], +replace_in_ctor_arg_list_2(Location, EqvMap, Seen, + [ctor_arg(N, T0, C) | As0], [ctor_arg(N, T, C) | As], !Circ, !VarSet, !Info, !UsedModules) :- replace_in_type_location_2(Location, EqvMap, Seen, T0, T, _, ContainsCirc, !VarSet, !Info, !UsedModules), diff --git a/compiler/error_util.m b/compiler/error_util.m index 52e7c19b4..f78e231fe 100644 --- a/compiler/error_util.m +++ b/compiler/error_util.m @@ -401,6 +401,13 @@ :- pred report_warning(prog_context::in, int::in, list(format_component)::in, io::di, io::uo) is det. +%-----------------------------------------------------------------------------% + + % Report why the file is not able to be opened, + % and set the exit status to be 1. + % +:- pred unable_to_open_file(string::in, io.error::in, io::di, io::uo) is det. + %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% @@ -1278,6 +1285,18 @@ report_warning(Context, Indent, Components, !IO) :- %-----------------------------------------------------------------------------% +unable_to_open_file(FileName, IOErr, !IO) :- + io.stderr_stream(StdErr, !IO), + io.write_string(StdErr, "Unable to open file: '", !IO), + io.write_string(StdErr, FileName, !IO), + io.write_string(StdErr, "' because\n", !IO), + io.write_string(StdErr, io.error_message(IOErr), !IO), + io.nl(StdErr, !IO), + + io.set_exit_status(1, !IO). + +%-----------------------------------------------------------------------------% + :- func this_file = string. this_file = "error_util.m". diff --git a/compiler/fact_table.m b/compiler/fact_table.m index abfabf68e..f00f556e8 100644 --- a/compiler/fact_table.m +++ b/compiler/fact_table.m @@ -387,7 +387,7 @@ compile_facts(PredName, Arity, PredInfo, ModuleInfo, FactArgInfos, ProcStreams, int::in, fact_result::out, error_reports::in, error_reports::out, io::di, io::uo) is det. -check_fact_term(_, _, _, _, term.variable(_V), _, _, _, _, error, +check_fact_term(_, _, _, _, term.variable(_V, _), _, _, _, _, error, !Errors, !IO) :- io.get_line_number(LineNum, !IO), io.input_stream_name(FileName, !IO), @@ -489,7 +489,7 @@ check_fact_type_and_mode(Types0, [Term | Terms], ArgNum0, PredOrFunc, Context0, Result, !Errors) :- ArgNum = ArgNum0 + 1, ( - Term = term.variable(_), + Term = term.variable(_, _), Msg = "Error: non-ground term in fact.", add_error_report(Context0, [words(Msg)], !Errors), Result = error diff --git a/compiler/handle_options.m b/compiler/handle_options.m index 10f3ac6a7..eb7a6d8c6 100644 --- a/compiler/handle_options.m +++ b/compiler/handle_options.m @@ -128,6 +128,8 @@ handle_options(Args0, Errors, OptionArgs, Args, Link, !IO) :- MakeTransOptInt, !IO), globals.io_lookup_bool_option(make_analysis_registry, MakeAnalysisRegistry, !IO), + globals.io_lookup_bool_option(make_xml_documentation, + MakeXmlDocumentation, !IO), globals.io_lookup_bool_option(convert_to_mercury, ConvertToMercury, !IO), globals.io_lookup_bool_option(typecheck_only, TypecheckOnly, !IO), @@ -140,8 +142,8 @@ handle_options(Args0, Errors, OptionArgs, Args, Link, !IO) :- bool.or_list([GenerateDependencies, GenerateDependencyFile, MakeInterface, MakePrivateInterface, MakeShortInterface, MakeOptimizationInt, MakeTransOptInt, MakeAnalysisRegistry, - ConvertToMercury, TypecheckOnly, ErrorcheckOnly, TargetCodeOnly, - GenerateIL, CompileOnly], + MakeXmlDocumentation, ConvertToMercury, TypecheckOnly, + ErrorcheckOnly, TargetCodeOnly, GenerateIL, CompileOnly], NotLink), bool.not(NotLink, Link), globals.io_lookup_bool_option(smart_recompilation, Smart, !IO), diff --git a/compiler/hhf.m b/compiler/hhf.m index 627613a0b..ae4d2d5db 100644 --- a/compiler/hhf.m +++ b/compiler/hhf.m @@ -410,7 +410,7 @@ complete_inst_graph_node(ModuleInfo, BaseVars, Var, !HI) :- type_ctor::in, constructor::in, hhf_info::in, hhf_info::out) is det. maybe_add_cons_id(Var, ModuleInfo, BaseVars, TypeId, Ctor, !HI) :- - Ctor = ctor(_, _, Name, Args), + Ctor = ctor(_, _, Name, Args, _), ConsId = make_cons_id(Name, Args, TypeId), map.lookup(!.HI ^ inst_graph, Var, node(Functors0, MaybeParent)), ( map.contains(Functors0, ConsId) -> @@ -429,7 +429,7 @@ maybe_add_cons_id(Var, ModuleInfo, BaseVars, TypeId, Ctor, !HI) :- is det. add_cons_id(Var, ModuleInfo, BaseVars, Arg, NewVar, !HI) :- - Arg = _ - ArgType, + ArgType = Arg ^ arg_type, !.HI = hhf_info(InstGraph0, VarSet0, VarTypes0), ( find_var_with_type(Var, ArgType, InstGraph0, VarTypes0, diff --git a/compiler/hlds_out.m b/compiler/hlds_out.m index 51916c28e..9c6b3aa90 100644 --- a/compiler/hlds_out.m +++ b/compiler/hlds_out.m @@ -1763,7 +1763,7 @@ write_goal_2(generic_call(GenericCall, ArgVars, Modes, _), ), term.context_init(Context), Functor = term.atom("class_method_call"), - TCInfoTerm = term.variable(TCInfoVar), + TCInfoTerm = term.variable(TCInfoVar, Context), MethodNumTerm = term.functor(term.integer(MethodNum), [], Context), term.var_list_to_term_list(ArgVars, ArgTerms), Term = term.functor(Functor, [TCInfoTerm, MethodNumTerm | ArgTerms], @@ -3321,7 +3321,7 @@ write_constructors_2(Indent, TVarSet, [C | Cs], TagValues, !IO) :- write_ctor(C, TVarSet, TagValues, !IO) :- mercury_output_ctor(C, TVarSet, !IO), - C = ctor(_, _, Name, Args), + C = ctor(_, _, Name, Args, _), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), ( map.search(TagValues, ConsId, TagValue) -> io.write_string("\t% tag: ", !IO), @@ -3980,11 +3980,11 @@ inst_to_term_with_context(ground(Uniq, GroundInstInfo), Context) = Term :- Term = make_atom(inst_uniqueness(Uniq, "ground"), Context) ). inst_to_term_with_context(inst_var(Var), _) = - term.coerce(term.variable(Var)). + term.coerce(term.variable(Var, context_init)). inst_to_term_with_context(constrained_inst_vars(Vars, Inst), Context) = set.fold(func(Var, Term) = term.functor(term.atom("=<"), - [term.coerce(term.variable(Var)), Term], Context), + [term.coerce(term.variable(Var, context_init)), Term], Context), Vars, inst_to_term_with_context(Inst, Context)). inst_to_term_with_context(abstract_inst(Name, Args), Context) = inst_name_to_term(user_inst(Name, Args), Context). diff --git a/compiler/inst_check.m b/compiler/inst_check.m index 8645b99ec..1fe286017 100644 --- a/compiler/inst_check.m +++ b/compiler/inst_check.m @@ -304,7 +304,7 @@ get_du_functors_for_type_def(TypeDef) = Functors :- :- func constructor_to_sym_name_and_arity(constructor) = sym_name_and_arity. -constructor_to_sym_name_and_arity(ctor(_, _, Name, Args)) = +constructor_to_sym_name_and_arity(ctor(_, _, Name, Args, _)) = Name / list.length(Args). % multi_map_set is the same as multi_map.set, except that the arguments are diff --git a/compiler/inst_graph.m b/compiler/inst_graph.m index b032e4b9b..f26b6e623 100644 --- a/compiler/inst_graph.m +++ b/compiler/inst_graph.m @@ -362,7 +362,7 @@ corresponding_members([_ | As], [_ | Bs], A, B) :- merge(InstGraph0, VarSet0, NewInstGraph, NewVarSet, InstGraph, VarSet, Sub) :- varset.merge_subst_without_names(VarSet0, NewVarSet, VarSet, Sub0), ( - map.map_values(pred(_::in, term.variable(V)::in, V::out) is semidet, + map.map_values(pred(_::in, term.variable(V, _)::in, V::out) is semidet, Sub0, Sub1) -> Sub = Sub1 diff --git a/compiler/intermod.m b/compiler/intermod.m index a1ac60af9..5effdd3ca 100644 --- a/compiler/intermod.m +++ b/compiler/intermod.m @@ -1672,7 +1672,7 @@ strip_headvar_unifications(HeadVars, clause(ProcIds, Goal0, Lang, Context), ( map.search(HeadVarMap, HeadVar0, HeadTerm0) -> HeadTerm = HeadTerm0 ; - HeadTerm = term.variable(HeadVar0) + HeadTerm = term.variable(HeadVar0, Context) ) ), HeadVars, HeadTerms), conj_list_to_goal(Goals, GoalInfo0, Goal) @@ -1694,12 +1694,12 @@ strip_headvar_unifications_from_goal_list([Goal | Goals0], HeadVars, ( Goal = unify(LHSVar, RHS, _, _, _) - _, list.member(LHSVar, HeadVars), + term.context_init(Context), ( RHS = rhs_var(RHSVar), - RHSTerm = term.variable(RHSVar) + RHSTerm = term.variable(RHSVar, Context) ; RHS = rhs_functor(ConsId, _, Args), - term.context_init(Context), ( ConsId = int_const(Int), RHSTerm = term.functor(term.integer(Int), [], Context) diff --git a/compiler/make_hlds_passes.m b/compiler/make_hlds_passes.m index 167b0c27d..3bdc0c181 100644 --- a/compiler/make_hlds_passes.m +++ b/compiler/make_hlds_passes.m @@ -1586,7 +1586,7 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, % Construct the semipure get predicate. % UnsafeGetPredName = mutable_unsafe_get_pred_sym_name(ModuleName, Name), - UnsafeGetCallArgs = [variable(X)], + UnsafeGetCallArgs = [variable(X, Context)], CallUnsafeGet = call_expr(UnsafeGetPredName, UnsafeGetCallArgs, purity_semipure) - Context, @@ -1600,7 +1600,7 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, ProgVarSet0, predicate, GetPredName, - [variable(X)], + [variable(X, context_init)], StdGetBody ), @@ -1610,7 +1610,7 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, % Construct the impure set predicate. % UnsafeSetPredName = mutable_unsafe_set_pred_sym_name(ModuleName, Name), - UnsafeSetCallArgs = [variable(X)], + UnsafeSetCallArgs = [variable(X, context_init)], StdSetCallUnsafeSet = call_expr(UnsafeSetPredName, UnsafeSetCallArgs, purity_impure) - Context, @@ -1622,7 +1622,7 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, ProgVarSet0, predicate, SetPredName, - [variable(X)], + [variable(X, context_init)], StdSetBody ), @@ -1639,12 +1639,13 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, IOGetBody = promise_purity_expr(dont_make_implicit_promises, purity_pure, GetBody) - Context, + Ctxt = context_init, IOGetClause = item_clause( compiler(mutable_decl), ProgVarSet, predicate, GetPredName, - [variable(X), variable(IO), variable(IO)], + [variable(X, Ctxt), variable(IO, Ctxt), variable(IO, Ctxt)], IOGetBody ), @@ -1664,7 +1665,7 @@ add_mutable_user_access_preds(ModuleName, Name, MutAttrs, Context, ProgVarSet, predicate, SetPredName, - [variable(X), variable(IO), variable(IO)], + [variable(X, Ctxt), variable(IO, Ctxt), variable(IO, Ctxt)], IOSetBody ), diff --git a/compiler/make_tags.m b/compiler/make_tags.m index b5c71fbe1..b4b024417 100644 --- a/compiler/make_tags.m +++ b/compiler/make_tags.m @@ -195,7 +195,7 @@ assign_constructor_tags(Ctors, UserEqCmp, TypeCtor, ReservedTagPragma, Globals, assign_enum_constants([], _, !CtorTags). assign_enum_constants([Ctor | Rest], Val, !CtorTags) :- - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), Tag = int_tag(Val), svmap.set(ConsId, Tag, !CtorTags), @@ -215,7 +215,7 @@ assign_reserved_numeric_addresses([Ctor | Rest], LeftOverConstants, ( Address >= NumReservedAddresses -> LeftOverConstants = [Ctor | Rest] ; - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), ( Address = 0 -> Tag = reserved_address_tag(null_pointer) @@ -240,7 +240,7 @@ assign_reserved_symbolic_addresses([Ctor | Ctors], LeftOverConstants, TypeCtor, ( Num >= Max -> LeftOverConstants = [Ctor | Ctors] ; - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), Arity = list.length(Args), Tag = reserved_address_tag(reserved_object(TypeCtor, Name, Arity)), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), @@ -278,7 +278,7 @@ assign_constant_tags(Constants, !CtorTags, InitTag, NextTag) :- assign_unshared_tags([], _, _, _, !CtorTags). assign_unshared_tags([Ctor | Rest], Val, MaxTag, ReservedAddresses, !CtorTags) :- - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), % If there's only one functor, % give it the "single_functor" (untagged) @@ -313,7 +313,7 @@ assign_unshared_tags([Ctor | Rest], Val, MaxTag, ReservedAddresses, assign_shared_remote_tags([], _, _, _, !CtorTags). assign_shared_remote_tags([Ctor | Rest], PrimaryVal, SecondaryVal, ReservedAddresses, !CtorTags) :- - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), Tag = maybe_add_reserved_addresses(ReservedAddresses, shared_remote_tag(PrimaryVal, SecondaryVal)), @@ -327,7 +327,7 @@ assign_shared_remote_tags([Ctor | Rest], PrimaryVal, SecondaryVal, assign_shared_local_tags([], _, _, !CtorTags). assign_shared_local_tags([Ctor | Rest], PrimaryVal, SecondaryVal, !CtorTags) :- - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ConsId = make_cons_id_from_qualified_sym_name(Name, Args), Tag = shared_local_tag(PrimaryVal, SecondaryVal), svmap.set(ConsId, Tag, !CtorTags), @@ -359,7 +359,7 @@ max_num_tags(NumTagBits) = MaxTags :- ctors_are_all_constants([]). ctors_are_all_constants([Ctor | Rest]) :- - Ctor = ctor(_ExistQVars, _Constraints, _Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, _Name, Args, _Ctxt), Args = [], ctors_are_all_constants(Rest). diff --git a/compiler/mercury_compile.m b/compiler/mercury_compile.m index b54cf8d63..9ecaeca65 100644 --- a/compiler/mercury_compile.m +++ b/compiler/mercury_compile.m @@ -139,6 +139,7 @@ :- import_module check_hlds.goal_path. :- import_module check_hlds.inst_check. :- import_module check_hlds.unused_imports. +:- import_module check_hlds.xml_documentation. :- import_module hlds.arg_info. :- import_module hlds.hlds_data. :- import_module hlds.hlds_module. @@ -1461,6 +1462,8 @@ mercury_compile(Module, NestedSubModules, FindTimestampFiles, MakeTransOptInt, !IO), globals.io_lookup_bool_option(make_analysis_registry, MakeAnalysisRegistry, !IO), + globals.io_lookup_bool_option(make_xml_documentation, + MakeXmlDocumentation, !IO), ( TypeCheckOnly = yes -> FactTableObjFiles = [] ; ErrorCheckOnly = yes -> @@ -1484,6 +1487,9 @@ mercury_compile(Module, NestedSubModules, FindTimestampFiles, ; MakeAnalysisRegistry = yes -> output_analysis_file(ModuleName, HLDS21, !DumpInfo, !IO), FactTableObjFiles = [] + ; MakeXmlDocumentation = yes -> + xml_documentation(HLDS21, !IO), + FactTableObjFiles = [] ; mercury_compile_after_front_end(NestedSubModules, FindTimestampFiles, MaybeTimestamps, ModuleName, HLDS21, @@ -2092,8 +2098,8 @@ frontend_pass_no_type_error(FoundUndefModeError, !FoundError, !HLDS, !DumpInfo, MakeOptInt = no, % Now go ahead and do the rest of mode checking % and determinism analysis. - frontend_pass_by_phases(!HLDS, FoundModeOrDetError, !DumpInfo, - !IO), + frontend_pass_by_phases(!HLDS, + FoundModeOrDetError, !DumpInfo, !IO), !:FoundError = !.FoundError `or` FoundModeOrDetError ) ) @@ -3509,6 +3515,7 @@ maybe_unused_imports(Verbose, Stats, HLDS, Specs, !IO) :- Specs = [] ). + :- pred maybe_type_ctor_infos(bool::in, bool::in, module_info::in, module_info::out, io::di, io::uo) is det. diff --git a/compiler/mercury_to_mercury.m b/compiler/mercury_to_mercury.m index fa5dafdf1..a0c0ec4ac 100644 --- a/compiler/mercury_to_mercury.m +++ b/compiler/mercury_to_mercury.m @@ -1066,13 +1066,13 @@ mercury_write_module_spec_list([ModuleName | ModuleNames], !IO) :- mercury_output_inst_defn(VarSet, Name, Args, abstract_inst, Context, !IO) :- io.write_string(":- inst (", !IO), - list.map(pred(V::in, variable(V)::out) is det, Args, ArgTerms), + ArgTerms = list.map(func(V) = variable(V, Context), Args), construct_qualified_term(Name, ArgTerms, Context, InstTerm), mercury_output_term(InstTerm, VarSet, no, !IO), io.write_string(").\n", !IO). mercury_output_inst_defn(VarSet, Name, Args, eqv_inst(Body), Context, !IO) :- io.write_string(":- inst (", !IO), - list.map(pred(V::in, variable(V)::out) is det, Args, ArgTerms), + ArgTerms = list.map(func(V) = variable(V, Context), Args), construct_qualified_term(Name, ArgTerms, Context, InstTerm), mercury_output_term(InstTerm, VarSet, no, !IO), io.write_string(") == ", !IO), @@ -1648,7 +1648,7 @@ mercury_format_constrained_inst_vars(Vars0, Inst, InstInfo, !U) :- mercury_format_mode_defn(VarSet, Name, Args, eqv_mode(Mode), Context, !U) :- add_string(":- mode (", !U), - list.map(pred(V::in, variable(V)::out) is det, Args, ArgTerms), + ArgTerms = list.map(func(V) = variable(V, Context), Args), construct_qualified_term(Name, ArgTerms, Context, ModeTerm), mercury_format_term(ModeTerm, VarSet, no, !U), add_string(") == ", !U), @@ -1720,7 +1720,7 @@ mercury_format_mode(user_defined_mode(Name, Args), InstInfo, !U) :- mercury_output_type_defn(TVarSet, Name, TParams, parse_tree_abstract_type(IsSolverType), Context, !IO) :- mercury_output_begin_type_decl(IsSolverType, !IO), - Args = list.map((func(V) = term.variable(V)), TParams), + Args = list.map((func(V) = term.variable(V, Context)), TParams), construct_qualified_term(Name, Args, Context, TypeTerm), mercury_output_term(TypeTerm, TVarSet, no, next_to_graphic_token, !IO), io.write_string(".\n", !IO). @@ -1728,7 +1728,7 @@ mercury_output_type_defn(TVarSet, Name, TParams, mercury_output_type_defn(TVarSet, Name, TParams, parse_tree_eqv_type(Body), Context, !IO) :- mercury_output_begin_type_decl(non_solver_type, !IO), - Args = list.map((func(V) = term.variable(V)), TParams), + Args = list.map((func(V) = term.variable(V, Context)), TParams), construct_qualified_term(Name, Args, Context, TypeTerm), mercury_output_term(TypeTerm, TVarSet, no, !IO), io.write_string(" == ", !IO), @@ -1738,7 +1738,7 @@ mercury_output_type_defn(TVarSet, Name, TParams, parse_tree_eqv_type(Body), mercury_output_type_defn(TVarSet, Name, TParams, parse_tree_du_type(Ctors, MaybeUserEqComp), Context, !IO) :- mercury_output_begin_type_decl(non_solver_type, !IO), - Args = list.map((func(V) = term.variable(V)), TParams), + Args = list.map((func(V) = term.variable(V, Context)), TParams), construct_qualified_term(Name, Args, Context, TypeTerm), mercury_output_term(TypeTerm, TVarSet, no, !IO), io.write_string("\n\t--->\t", !IO), @@ -1750,7 +1750,7 @@ mercury_output_type_defn(TVarSet, Name, TParams, parse_tree_solver_type(SolverTypeDetails, MaybeUserEqComp), Context, !IO) :- mercury_output_begin_type_decl(solver_type, !IO), - Args = list.map((func(V) = term.variable(V)), TParams), + Args = list.map((func(V) = term.variable(V, Context)), TParams), construct_qualified_term(Name, Args, Context, TypeTerm), mercury_output_term(TypeTerm, TVarSet, no, !IO), mercury_output_where_attributes(TVarSet, yes(SolverTypeDetails), @@ -1771,7 +1771,7 @@ mercury_output_type_defn(TVarSet, Name, TParams, ForeignType = java(_), io.write_string("java, ", !IO) ), - Args = list.map((func(V) = term.variable(V)), TParams), + Args = list.map((func(V) = term.variable(V, context_init)), TParams), construct_qualified_term(Name, Args, MercuryType), mercury_output_term(MercuryType, TVarSet, no, !IO), io.write_string(", \"", !IO), @@ -1930,7 +1930,7 @@ mercury_output_ctors([Ctor | Ctors], VarSet, !IO) :- mercury_output_ctors(Ctors, VarSet, !IO). mercury_output_ctor(Ctor, VarSet, !IO) :- - Ctor = ctor(ExistQVars, Constraints, SymName, Args), + Ctor = ctor(ExistQVars, Constraints, SymName, Args, _Ctxt), % We'll have attached the module name to the type definition, % so there's no point adding it to the constructor as well. @@ -1994,15 +1994,14 @@ mercury_output_ctor(Ctor, VarSet, !IO) :- :- pred mercury_output_ctor_arg(tvarset::in, constructor_arg::in, io::di, io::uo) is det. -mercury_output_ctor_arg(Varset, N - T, !IO) :- +mercury_output_ctor_arg(Varset, ctor_arg(N, T, _), !IO) :- mercury_output_ctor_arg_name_prefix(N, !IO), mercury_output_type(Varset, no, T, !IO). mercury_output_remaining_ctor_args(_Varset, [], !IO). -mercury_output_remaining_ctor_args(Varset, [N - T | As], !IO) :- +mercury_output_remaining_ctor_args(Varset, [A | As], !IO) :- io.write_string(", ", !IO), - mercury_output_ctor_arg_name_prefix(N, !IO), - mercury_output_type(Varset, no, T, !IO), + mercury_output_ctor_arg(Varset, A, !IO), mercury_output_remaining_ctor_args(Varset, As, !IO). :- pred mercury_output_ctor_arg_name_prefix(maybe(ctor_field_name)::in, @@ -3694,7 +3693,7 @@ mercury_format_term(Term, VarSet, AppendVarnums, !U) :- :- pred mercury_format_term(term(T)::in, varset(T)::in, bool::in, needs_quotes::in, U::di, U::uo) is det <= output(U). -mercury_format_term(term.variable(Var), VarSet, AppendVarnums, _, !U) :- +mercury_format_term(term.variable(Var, _), VarSet, AppendVarnums, _, !U) :- mercury_format_var(VarSet, AppendVarnums, Var, !U). mercury_format_term(term.functor(Functor, Args, _), VarSet, AppendVarnums, NextToGraphicToken, !U) :- @@ -4289,7 +4288,7 @@ output_list([Item | Items], Sep, Pred, !Str) :- :- pred builtin_inst_name(sym_name::in, list(inst_var)::in) is semidet. builtin_inst_name(unqualified(Name), Args0) :- - Args1 = list.map(func(V) = term.variable(term.coerce_var(V)), Args0), + Args1 = list.map(func(V) = variable(coerce_var(V), context_init), Args0), Term = term.functor(term.atom(Name), Args1, term.context_init), convert_inst(no_allow_constrained_inst_var, Term, Inst), Inst \= defined_inst(user_inst(_, _)). diff --git a/compiler/ml_type_gen.m b/compiler/ml_type_gen.m index 78c9a773c..f87d6c392 100644 --- a/compiler/ml_type_gen.m +++ b/compiler/ml_type_gen.m @@ -235,7 +235,7 @@ ml_gen_enum_value_member(Context) = ml_gen_enum_constant(Context, ConsTagValues, Ctor) = MLDS_Defn :- % Figure out the value of this enumeration constant. - Ctor = ctor(_ExistQTVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQTVars, _Constraints, Name, Args, _Ctxt), list.length(Args, Arity), map.lookup(ConsTagValues, cons(Name, Arity), TagVal), ( TagVal = int_tag(Int) -> @@ -449,7 +449,7 @@ ml_gen_tag_constant(Context, ConsTagValues, Ctor) = MLDS_Defns :- % we don't do the same thing for primary tags, so this is most useful % in the `--tags none' case, where there will be no primary tags. - Ctor = ctor(_ExistQTVars, _Constraints, Name, _Args), + Ctor = ctor(_ExistQTVars, _Constraints, Name, _Args, _Ctxt), UnqualifiedName = unqualify_name(Name), ConstValue = const(mlconst_int(SecondaryTag)), MLDS_Defn = mlds_defn( @@ -507,7 +507,7 @@ tagval_is_reserved_addr(shared_with_reserved_addresses_tag(_, TagVal), RA) :- :- func get_tagval(cons_tag_values, constructor) = cons_tag. get_tagval(ConsTagValues, Ctor) = TagVal :- - Ctor = ctor(_ExistQTVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQTVars, _Constraints, Name, Args, _Ctxt), list.length(Args, Arity), map.lookup(ConsTagValues, cons(Name, Arity), TagVal). @@ -566,7 +566,7 @@ ml_gen_secondary_tag_class(MLDS_Context, BaseClassQualifier, BaseClassId, ml_gen_du_ctor_member(ModuleInfo, BaseClassId, BaseClassQualifier, SecondaryTagClassId, TypeDefn, ConsTagValues, Ctor, MLDS_Members0, MLDS_Members, MLDS_CtorMethods0, MLDS_CtorMethods) :- - Ctor = ctor(ExistQTVars, Constraints, CtorName, Args), + Ctor = ctor(ExistQTVars, Constraints, CtorName, Args, _Ctxt), % XXX We should keep a context for the constructor, % but we don't, so we just use the context from the type. @@ -888,10 +888,9 @@ ml_gen_type_info_member(ModuleInfo, Context, TypeVar, MLDS_Defn, :- pred ml_gen_du_ctor_field(module_info::in, prog_context::in, constructor_arg::in, mlds_defn::out, int::in, int::out) is det. -ml_gen_du_ctor_field(ModuleInfo, Context, MaybeFieldName - Type, MLDS_Defn, - ArgNum0, ArgNum) :- - ml_gen_field(ModuleInfo, Context, MaybeFieldName, Type, MLDS_Defn, - ArgNum0, ArgNum). +ml_gen_du_ctor_field(ModuleInfo, Context, Arg, MLDS_Defn, ArgNum0, ArgNum) :- + ml_gen_field(ModuleInfo, Context, Arg ^ arg_field_name, Arg ^ arg_type, + MLDS_Defn, ArgNum0, ArgNum). :- pred ml_gen_field(module_info::in, prog_context::in, maybe(ctor_field_name)::in, mer_type::in, mlds_defn::out, diff --git a/compiler/ml_unify_gen.m b/compiler/ml_unify_gen.m index b4ce0f457..78dddf990 100644 --- a/compiler/ml_unify_gen.m +++ b/compiler/ml_unify_gen.m @@ -968,7 +968,7 @@ constructor_arg_types(CtorId, ArgTypes, Type, ModuleInfo) = ConsArgTypes :- type_util.get_cons_defn(ModuleInfo, TypeCtor, CtorId, ConsDefn) -> ConsDefn = hlds_cons_defn(_, _, ConsArgDefns, _, _), - assoc_list.values(ConsArgDefns, ConsArgTypes0), + ConsArgTypes0 = list.map(func(C) = C ^ arg_type, ConsArgDefns), % There may have been additional types inserted to hold the % type_infos and type_class_infos for existentially quantified @@ -1426,7 +1426,8 @@ ml_tag_offset_and_argnum(Tag, TagBits, OffSet, ArgNum) :- ml_field_names_and_types(Info, Type, ConsId, ArgTypes, Fields) :- % Lookup the field types for the arguments of this cons_id. - MakeUnnamedField = (func(FieldType) = no - FieldType), + Context = term.context_init, + MakeUnnamedField = (func(FieldType) = ctor_arg(no, FieldType, Context)), ( type_is_tuple(Type, _), list.length(ArgTypes, TupleArity) @@ -1493,7 +1494,8 @@ ml_gen_unify_args_2(ConsId, [Arg | Args], [Mode | Modes], [ArgType | ArgTypes], ml_gen_unify_arg(ConsId, Arg, Mode, ArgType, Field, VarType, VarLval, Offset, ArgNum, Tag, Context, !Statements, !Info) :- - Field = MaybeFieldName - FieldType, + MaybeFieldName = Field ^ arg_field_name, + FieldType = Field ^ arg_type, ml_gen_info_get_module_info(!.Info, ModuleInfo), module_info_get_globals(ModuleInfo, Globals), globals.lookup_bool_option(Globals, highlevel_data, HighLevelData), diff --git a/compiler/mode_util.m b/compiler/mode_util.m index bd4c09f6c..11a37c624 100644 --- a/compiler/mode_util.m +++ b/compiler/mode_util.m @@ -763,7 +763,7 @@ constructors_to_bound_any_insts(ModuleInfo, Uniq, Constructors, BoundInsts) :- constructors_to_bound_insts_2(_, _, [], _, []). constructors_to_bound_insts_2(ModuleInfo, Uniq, [Ctor | Ctors], ArgInst, [BoundInst | BoundInsts]) :- - Ctor = ctor(_ExistQVars, _Constraints, Name, Args), + Ctor = ctor(_ExistQVars, _Constraints, Name, Args, _Ctxt), ctor_arg_list_to_inst_list(Args, ArgInst, Insts), list.length(Insts, Arity), BoundInst = bound_functor(cons(Name, Arity), Insts), @@ -774,7 +774,7 @@ constructors_to_bound_insts_2(ModuleInfo, Uniq, [Ctor | Ctors], ArgInst, list(mer_inst)::out) is det. ctor_arg_list_to_inst_list([], _, []). -ctor_arg_list_to_inst_list([_Name - _Type | Args], Inst, [Inst | Insts]) :- +ctor_arg_list_to_inst_list([_ | Args], Inst, [Inst | Insts]) :- ctor_arg_list_to_inst_list(Args, Inst, Insts). :- pred propagate_ctor_info_2(module_info::in, mer_type::in, @@ -844,14 +844,14 @@ propagate_ctor_info_3(ModuleInfo, Subst, TypeModule, Constructors, ( ConsId = cons(ConsName, Arity), GetCons = (pred(Ctor::in) is semidet :- - Ctor = ctor(_, _, ConsName, CtorArgs), + Ctor = ctor(_, _, ConsName, CtorArgs, _), list.length(CtorArgs, Arity) ), list.filter(GetCons, Constructors, [Constructor]) -> - Constructor = ctor(_ExistQVars, _Constraints, _Name, Args), + Constructor = ctor(_ExistQVars, _Constraints, _Name, Args, _Ctxt), GetArgTypes = (pred(CtorArg::in, ArgType::out) is det :- - CtorArg = _ArgName - ArgType + ArgType = CtorArg ^ arg_type ), list.map(GetArgTypes, Args, ArgTypes), propagate_types_into_inst_list(ModuleInfo, Subst, ArgTypes, diff --git a/compiler/module_qual.m b/compiler/module_qual.m index 7a7de3f34..c7490b1e8 100644 --- a/compiler/module_qual.m +++ b/compiler/module_qual.m @@ -825,11 +825,11 @@ qualify_type_defn(parse_tree_solver_type(SolverTypeDetails0, MaybeUserEqComp), qualify_constructors([], [], !Info, !Specs). qualify_constructors([Ctor0 | Ctors0], [Ctor | Ctors], !Info, !Specs) :- - Ctor0 = ctor(ExistQVars, Constraints0, SymName, Args0), + Ctor0 = ctor(ExistQVars, Constraints0, SymName, Args0, Ctxt), qualify_constructor_arg_list(Args0, Args, !Info, !Specs), qualify_constructors(Ctors0, Ctors, !Info, !Specs), qualify_prog_constraint_list(Constraints0, Constraints, !Info, !Specs), - Ctor = ctor(ExistQVars, Constraints, SymName, Args). + Ctor = ctor(ExistQVars, Constraints, SymName, Args, Ctxt). % Qualify the inst parameters of an inst definition. % @@ -1006,9 +1006,9 @@ qualify_bound_inst_list([bound_functor(ConsId, Insts0) | BoundInsts0], list(error_spec)::in, list(error_spec)::out) is det. qualify_constructor_arg_list([], [], !Info, !Specs). -qualify_constructor_arg_list([Name - Type0 | Args0], [Name - Type | Args], - !Info, !Specs) :- - qualify_type(Type0, Type, !Info, !Specs), +qualify_constructor_arg_list([Arg0 | Args0], [Arg | Args], !Info, !Specs) :- + qualify_type(Arg0 ^ arg_type, Type, !Info, !Specs), + Arg = Arg0 ^ arg_type := Type, qualify_constructor_arg_list(Args0, Args, !Info, !Specs). :- pred qualify_type_list(list(mer_type)::in, list(mer_type)::out, diff --git a/compiler/notes/compiler_design.html b/compiler/notes/compiler_design.html index e049994ad..c22f7447b 100644 --- a/compiler/notes/compiler_design.html +++ b/compiler/notes/compiler_design.html @@ -866,6 +866,14 @@ so that the compiler does the right thing for options such as implementation.
+
+