[m-rev.] diff: fix bug in named argument access
Zoltan Somogyi
zs at cs.mu.OZ.AU
Mon Apr 5 17:18:26 AEST 2004
runtime/mercury_ml_expand_body.h:
Fix a bug that caused a runtime abort if you called the library
function named_argument (which is implemented in this file) on
a value of a type which has no field name information at all.
browser/browse.m:
Generate better error messages when an attempt to change to a subterm
fails: say which step failed, and which ones succeeded.
tests/debugger/field_names.{m,inp,exp}:
Strengthen the test case to cover types with no field names at all:
a regression test to check for the bug in mercury_ml_expand_body.h.
Strengthen the test case using several unsuccessful commands, to test
the improved error messsages.
tests/debugger/polymorphic_output.exp*:
Update the expected outputs of this test case to account for the new
error messages.
Zoltan.
cvs diff: Diffing .
cvs diff: Diffing analysis
cvs diff: Diffing bindist
cvs diff: Diffing boehm_gc
cvs diff: Diffing boehm_gc/Mac_files
cvs diff: Diffing boehm_gc/cord
cvs diff: Diffing boehm_gc/cord/private
cvs diff: Diffing boehm_gc/doc
cvs diff: Diffing boehm_gc/include
cvs diff: Diffing boehm_gc/include/private
cvs diff: Diffing boehm_gc/tests
cvs diff: Diffing browser
Index: browser/browse.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/browser/browse.m,v
retrieving revision 1.41
diff -u -b -r1.41 browse.m
--- browser/browse.m 5 Apr 2004 05:06:41 -0000 1.41
+++ browser/browse.m 5 Apr 2004 05:12:56 -0000
@@ -1,5 +1,5 @@
%---------------------------------------------------------------------------%
-% Copyright (C) 1998-2004 The University of Melbourne.
+% Copyright (C) 1998-2003 The University of Melbourne.
% This file may only be copied under the terms of the GNU Library General
% Public License - see the file COPYING.LIB in the Mercury distribution.
%---------------------------------------------------------------------------%
@@ -369,11 +369,13 @@
;
Command = cd(Path),
change_dir(!.Info ^ dirs, Path, NewPwd),
- ( deref_subterm(!.Info ^ term, NewPwd, _SubUniv) ->
+ deref_subterm(!.Info ^ term, NewPwd, [], Result),
+ (
+ Result = deref_result(_),
!:Info = !.Info ^ dirs := NewPwd
;
- write_string_debugger(Debugger,
- "error: cannot change to subterm\n", !IO)
+ Result = deref_error(OKPath, ErrorDir),
+ report_deref_error(Debugger, OKPath, ErrorDir, !IO)
),
Quit = no
;
@@ -393,10 +395,13 @@
;
Command = mark(Path),
change_dir(!.Info ^ dirs, Path, NewPwd),
- ( deref_subterm(!.Info ^ term, NewPwd, _SubUniv) ->
+ deref_subterm(!.Info ^ term, NewPwd, [], SubResult),
+ (
+ SubResult = deref_result(_),
!:Info = !.Info ^ maybe_mark := yes(NewPwd),
Quit = yes
;
+ SubResult = deref_error(_, _),
write_string_debugger(Debugger,
"error: cannot mark subterm\n", !IO),
Quit = no
@@ -557,9 +562,9 @@
portray(Debugger, Caller, MaybeFormat, Info, !IO) :-
browser_info__get_format(Info, Caller, MaybeFormat, Format),
browser_info__get_format_params(Info, Caller, Format, Params),
+ deref_subterm(Info ^ term, Info ^ dirs, [], SubResult),
(
- deref_subterm(Info ^ term, Info ^ dirs, SubUniv)
- ->
+ SubResult = deref_result(SubUniv),
(
Format = flat,
portray_flat(Debugger, SubUniv, Params, !IO)
@@ -574,7 +579,9 @@
portray_pretty(Debugger, SubUniv, Params, !IO)
)
;
- write_string_debugger(Debugger, "error: no such subterm", !IO)
+ SubResult = deref_error(OKPath, ErrorDir),
+ report_deref_error(Debugger, OKPath, ErrorDir, !IO)
+ % write_string_debugger(Debugger, "error: no such subterm")
),
nl_debugger(Debugger, !IO).
@@ -724,6 +731,21 @@
io__write_univ(Stream, include_details_cc, Univ, !IO)
).
+:- pred report_deref_error(debugger::in, list(dir)::in, dir::in,
+ io::di, io::uo) is det.
+
+report_deref_error(Debugger, OKPath, ErrorDir, !IO) :-
+ write_string_debugger(Debugger, "error: ", !IO),
+ (
+ OKPath = [_ | _],
+ Context = "in subdir " ++ dirs_to_string(OKPath) ++ ": ",
+ write_string_debugger(Debugger, Context, !IO)
+ ;
+ OKPath = []
+ ),
+ Msg = "there is no subterm " ++ dir_to_string(ErrorDir) ++ "\n",
+ write_string_debugger(Debugger, Msg, !IO).
+
%---------------------------------------------------------------------------%
%
% Single-line representation of a term.
@@ -1107,74 +1129,98 @@
write_path_2(Debugger, [Dir2 | Dirs], !IO)
).
+:- type deref_result(T)
+ ---> deref_result(T)
+ ; deref_error(list(dir), dir).
+
% We assume a root-relative path. We assume Term is the entire term
% passed into browse/3, not a subterm.
-:- pred deref_subterm(browser_term::in, list(dir)::in, browser_term::out)
- is semidet.
+:- pred deref_subterm(browser_term::in, list(dir)::in, list(dir)::in,
+ deref_result(browser_term)::out) is det.
-deref_subterm(BrowserTerm, Path, SubBrowserTerm) :-
+deref_subterm(BrowserTerm, Path, RevPath0, Result) :-
simplify_dirs(Path, SimplifiedPath),
(
BrowserTerm = plain_term(Univ),
- deref_subterm_2(Univ, SimplifiedPath, SubUniv),
- SubBrowserTerm = plain_term(SubUniv)
+ deref_subterm_2(Univ, SimplifiedPath, RevPath0, SubResult),
+ deref_result_univ_to_browser_term(SubResult, Result)
;
BrowserTerm = synthetic_term(_Functor, Args, MaybeReturn),
(
SimplifiedPath = [],
- SubBrowserTerm = BrowserTerm
+ SubBrowserTerm = BrowserTerm,
+ Result = deref_result(SubBrowserTerm)
;
SimplifiedPath = [Step | SimplifiedPathTail],
(
+ (
Step = child_num(N),
- % The first argument of a non-array is numbered
- % argument 1.
+ % The first argument of a non-array
+ % is numbered argument 1.
list__index1(Args, N, ArgUniv)
;
Step = child_name(Name),
- (
- MaybeReturn = yes(ArgUnivPrime),
+ MaybeReturn = yes(ArgUniv),
( Name = "r"
; Name = "res"
; Name = "result"
)
- ->
- ArgUniv = ArgUnivPrime
- ;
- fail
- )
;
Step = parent,
error("deref_subterm: found parent")
- ),
- deref_subterm_2(ArgUniv, SimplifiedPathTail, SubUniv),
- SubBrowserTerm = plain_term(SubUniv)
)
+ ->
+ deref_subterm_2(ArgUniv, SimplifiedPathTail,
+ [Step | RevPath0], SubResult),
+ deref_result_univ_to_browser_term(SubResult,
+ Result)
+ ;
+ Result = deref_error(list__reverse(RevPath0),
+ Step)
+ )
+ )
+ ).
+
+:- pred deref_result_univ_to_browser_term(deref_result(univ)::in,
+ deref_result(browser_term)::out) is det.
+
+deref_result_univ_to_browser_term(SubResult, Result) :-
+ (
+ SubResult = deref_result(SubUniv),
+ SubBrowserTerm = plain_term(SubUniv),
+ Result = deref_result(SubBrowserTerm)
+ ;
+ SubResult = deref_error(OKPath, ErrorDir),
+ Result = deref_error(OKPath, ErrorDir)
).
-:- pred deref_subterm_2(univ::in, list(dir)::in, univ::out) is semidet.
+:- pred deref_subterm_2(univ::in, list(dir)::in, list(dir)::in,
+ deref_result(univ)::out) is det.
-deref_subterm_2(Univ, Path, SubUniv) :-
+deref_subterm_2(Univ, Path, RevPath0, Result) :-
(
Path = [],
- Univ = SubUniv
+ Result = deref_result(Univ)
;
Path = [Dir | Dirs],
(
+ (
Dir = child_num(N),
(
TypeCtor = type_ctor(univ_type(Univ)),
type_ctor_name(TypeCtor) = "array",
- type_ctor_module_name(TypeCtor) = "array"
+ type_ctor_module_name(TypeCtor) =
+ "array"
->
- % The first element of an array is at
- % index zero.
+ % The first element of an array
+ % is at index zero.
ArgN = argument(univ_value(Univ), N)
;
- % The first argument of a non-array is numbered
- % argument 1 by the user but argument 0 by
- % std_util:argument.
- ArgN = argument(univ_value(Univ), N - 1)
+ % The first argument of a non-array is
+ % numbered argument 1 by the user
+ % but argument 0 by std_util:argument.
+ ArgN = argument(univ_value(Univ),
+ N - 1)
)
;
Dir = child_name(Name),
@@ -1182,8 +1228,12 @@
;
Dir = parent,
error("deref_subterm_2: found parent")
- ),
- deref_subterm_2(ArgN, Dirs, SubUniv)
+ )
+ ->
+ deref_subterm_2(ArgN, Dirs, [Dir | RevPath0], Result)
+ ;
+ Result = deref_error(list__reverse(RevPath0), Dir)
+ )
).
%---------------------------------------------------------------------------%
@@ -1405,6 +1455,22 @@
;
simplify(Rest, SimplifiedRest),
Simplified = [First | SimplifiedRest]
+ ).
+
+:- func dir_to_string(dir) = string.
+
+dir_to_string(parent) = "..".
+dir_to_string(child_num(Num)) = int_to_string(Num).
+dir_to_string(child_name(Name)) = Name.
+
+:- func dirs_to_string(list(dir)) = string.
+
+dirs_to_string([]) = "".
+dirs_to_string([Dir | Dirs]) =
+ ( Dirs = [] ->
+ dir_to_string(Dir)
+ ;
+ dir_to_string(Dir) ++ "/" ++ dirs_to_string(Dirs)
).
%---------------------------------------------------------------------------%
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
cvs diff: Diffing compiler/notes
cvs diff: Diffing debian
cvs diff: Diffing deep_profiler
cvs diff: Diffing deep_profiler/notes
cvs diff: Diffing doc
cvs diff: Diffing extras
cvs diff: Diffing extras/aditi
cvs diff: Diffing extras/cgi
cvs diff: Diffing extras/complex_numbers
cvs diff: Diffing extras/complex_numbers/samples
cvs diff: Diffing extras/complex_numbers/tests
cvs diff: Diffing extras/concurrency
cvs diff: Diffing extras/curs
cvs diff: Diffing extras/curs/samples
cvs diff: Diffing extras/curses
cvs diff: Diffing extras/curses/sample
cvs diff: Diffing extras/dynamic_linking
cvs diff: Diffing extras/error
cvs diff: Diffing extras/graphics
cvs diff: Diffing extras/graphics/mercury_opengl
cvs diff: Diffing extras/graphics/mercury_tcltk
cvs diff: Diffing extras/graphics/samples
cvs diff: Diffing extras/graphics/samples/calc
cvs diff: Diffing extras/graphics/samples/maze
cvs diff: Diffing extras/graphics/samples/pent
cvs diff: Diffing extras/lazy_evaluation
cvs diff: Diffing extras/lex
cvs diff: Diffing extras/lex/samples
cvs diff: Diffing extras/lex/tests
cvs diff: Diffing extras/logged_output
cvs diff: Diffing extras/moose
cvs diff: Diffing extras/moose/samples
cvs diff: Diffing extras/moose/tests
cvs diff: Diffing extras/morphine
cvs diff: Diffing extras/morphine/non-regression-tests
cvs diff: Diffing extras/morphine/scripts
cvs diff: Diffing extras/morphine/source
cvs diff: Diffing extras/odbc
cvs diff: Diffing extras/posix
cvs diff: Diffing extras/quickcheck
cvs diff: Diffing extras/quickcheck/tutes
cvs diff: Diffing extras/references
cvs diff: Diffing extras/references/samples
cvs diff: Diffing extras/references/tests
cvs diff: Diffing extras/stream
cvs diff: Diffing extras/trailed_update
cvs diff: Diffing extras/trailed_update/samples
cvs diff: Diffing extras/trailed_update/tests
cvs diff: Diffing extras/xml
cvs diff: Diffing extras/xml/samples
cvs diff: Diffing java
cvs diff: Diffing java/library
cvs diff: Diffing java/runtime
cvs diff: Diffing library
cvs diff: Diffing profiler
cvs diff: Diffing robdd
cvs diff: Diffing runtime
Index: runtime/mercury_ml_expand_body.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_ml_expand_body.h,v
retrieving revision 1.29
diff -u -b -r1.29 mercury_ml_expand_body.h
--- runtime/mercury_ml_expand_body.h 20 Oct 2003 07:29:32 -0000 1.29
+++ runtime/mercury_ml_expand_body.h 2 Apr 2004 05:56:15 -0000
@@ -476,7 +476,8 @@
int i;
for (i = 0; i < expand_info->arity; i++) {
- if (functor_desc->MR_du_functor_arg_names[i] != NULL
+ if (functor_desc->MR_du_functor_arg_names != NULL
+ && functor_desc->MR_du_functor_arg_names[i] != NULL
&& MR_streq(
functor_desc->MR_du_functor_arg_names[i],
chosen_name))
cvs diff: Diffing runtime/GETOPT
cvs diff: Diffing runtime/machdeps
cvs diff: Diffing samples
cvs diff: Diffing samples/c_interface
cvs diff: Diffing samples/c_interface/c_calls_mercury
cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/mercury_calls_c
cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/diff
cvs diff: Diffing samples/muz
cvs diff: Diffing samples/rot13
cvs diff: Diffing samples/solutions
cvs diff: Diffing samples/tests
cvs diff: Diffing samples/tests/c_interface
cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/tests/diff
cvs diff: Diffing samples/tests/muz
cvs diff: Diffing samples/tests/rot13
cvs diff: Diffing samples/tests/solutions
cvs diff: Diffing samples/tests/toplevel
cvs diff: Diffing scripts
cvs diff: Diffing tests
cvs diff: Diffing tests/benchmarks
cvs diff: Diffing tests/debugger
Index: tests/debugger/field_names.exp
===================================================================
RCS file: /home/mercury/mercury1/repository/tests/debugger/field_names.exp,v
retrieving revision 1.4
diff -u -b -r1.4 field_names.exp
--- tests/debugger/field_names.exp 17 Jan 2003 05:56:52 -0000 1.4
+++ tests/debugger/field_names.exp 2 Apr 2004 07:42:26 -0000
@@ -1,4 +1,4 @@
- 1: 1 1 CALL pred field_names.main/2-0 (det) field_names.m:51
+ 1: 1 1 CALL pred field_names.main/2-0 (det) field_names.m:60
mdb> echo on
Command echo enabled.
mdb> context none
@@ -11,6 +11,10 @@
HeadVar__5 t1f1(41, 42, 43, 44)
mdb> p 5^1x
mdb: bad component selector.
+mdb> p 5^1^x
+mdb: the path x does not exist.
+mdb> p 5^x
+mdb: the path x does not exist.
mdb> p 5^1
HeadVar__5 41
mdb> p 5^2
@@ -31,7 +35,7 @@
mdb: the path t1e does not exist.
mdb> browse 5
browser> ^1x
-error: cannot change to subterm
+error: in subdir 1: there is no subterm x
browser> ^1
browser> p
41
@@ -42,15 +46,23 @@
browser> p
42
browser> ^..^t1c
-error: cannot change to subterm
+error: there is no subterm t1c
browser> ^..^t1d
browser> p
44
browser> ^..^t1e
-error: cannot change to subterm
+error: there is no subterm t1e
browser> p
44
browser> quit
+mdb> browse
+browser> ^x
+error: there is no subterm x
+browser> ^8
+error: there is no subterm 8
+browser> ^5^x
+error: in subdir 5: there is no subterm x
+browser> quit
mdb> step
4: 3 2 CALL pred field_names.make_t1f2/4-0 (det)
mdb> finish
@@ -73,12 +85,12 @@
HeadVar__4 53
mdb> browse 4
browser> ^t1a
-error: cannot change to subterm
+error: there is no subterm t1a
browser> ^t1e
browser> p
51
browser> ^..^t1f
-error: cannot change to subterm
+error: there is no subterm t1f
browser> ^..^t1g
browser> p
53
@@ -308,6 +320,32 @@
mdb: the path t5a does not exist.
mdb> p 2/t6a
mdb: the path t6a does not exist.
+mdb> browse 2
+browser> p
+t6f(0.900000000000000)
+browser> ^badname
+error: there is no subterm badname
+browser> quit
+mdb> step
+ 16: 9 2 CALL pred field_names.make_t7/3-0 (det)
+mdb> finish
+ 17: 9 2 EXIT pred field_names.make_t7/3-0 (det)
+mdb> browse 3
+browser> p
+t7f(0.900000000000000, 77)
+browser> ^badname
+error: there is no subterm badname
+browser> quit
+mdb> step
+ 18: 10 2 CALL pred field_names.make_t8/1-0 (det)
+mdb> finish
+ 19: 10 2 EXIT pred field_names.make_t8/1-0 (det)
+mdb> browse 1
+browser> p
+t8a
+browser> ^badname
+error: there is no subterm badname
+browser> quit
mdb> continue -S
t1f1(41, 42, 43, 44)
t1f2(51, 52, 53)
@@ -316,3 +354,5 @@
t2f(0.600000000000000, 61, t1f1(41, 42, 43, 44), t1f2(51, 52, 53))
t5f(t1f1(41, 42, 43, 44))
t6f(0.900000000000000)
+t7f(0.900000000000000, 77)
+t8a
Index: tests/debugger/field_names.inp
===================================================================
RCS file: /home/mercury/mercury1/repository/tests/debugger/field_names.inp,v
retrieving revision 1.2
diff -u -b -r1.2 field_names.inp
--- tests/debugger/field_names.inp 19 Dec 2001 06:44:51 -0000 1.2
+++ tests/debugger/field_names.inp 2 Apr 2004 07:37:05 -0000
@@ -4,6 +4,8 @@
finish
p 5
p 5^1x
+p 5^1^x
+p 5^x
p 5^1
p 5^2
p 5^3
@@ -27,6 +29,11 @@
^..^t1e
p
quit
+browse
+^x
+^8
+^5^x
+quit
step
finish
p 4
@@ -162,4 +169,20 @@
p 2/1
p 2/t5a
p 2/t6a
+browse 2
+p
+^badname
+quit
+step
+finish
+browse 3
+p
+^badname
+quit
+step
+finish
+browse 1
+p
+^badname
+quit
continue -S
Index: tests/debugger/field_names.m
===================================================================
RCS file: /home/mercury/mercury1/repository/tests/debugger/field_names.m,v
retrieving revision 1.1
diff -u -b -r1.1 field_names.m
--- tests/debugger/field_names.m 18 Dec 2000 07:43:04 -0000 1.1
+++ tests/debugger/field_names.m 2 Apr 2004 06:10:26 -0000
@@ -48,6 +48,15 @@
float
).
+:- type t7
+ ---> t7f(
+ float,
+ int
+ ).
+
+:- type t8
+ ---> t8a ; t8b.
+
main -->
{ make_t1f1(41, 42, 43, 44, T1F1) },
{ make_t1f2(51, 52, 53, T1F2) },
@@ -56,13 +65,17 @@
{ make_t4(T2, T4) },
{ make_t5(T1F1, T5) },
{ make_t6(0.9, T6) },
+ { make_t7(0.9, 77, T7) },
+ { make_t8(T8) },
io__write(T1F1), nl,
io__write(T1F2), nl,
io__write(T2), nl,
io__write(T3), nl,
io__write(T4), nl,
io__write(T5), nl,
- io__write(T6), nl.
+ io__write(T6), nl,
+ io__write(T7), nl,
+ io__write(T8), nl.
:- pred make_t1f1(int::in, int::in, int::in, int::in, t1::out) is det.
make_t1f1(A, B, C, D, t1f1(A, B, C, D)).
@@ -84,3 +97,9 @@
:- pred make_t6(float::in, t6::out) is det.
make_t6(A, t6f(A)).
+
+:- pred make_t7(float::in, int::in, t7::out) is det.
+make_t7(A, B, t7f(A, B)).
+
+:- pred make_t8(t8::out) is det.
+make_t8(t8a).
Index: tests/debugger/polymorphic_output.exp
===================================================================
RCS file: /home/mercury/mercury1/repository/tests/debugger/polymorphic_output.exp,v
retrieving revision 1.11
diff -u -b -r1.11 polymorphic_output.exp
--- tests/debugger/polymorphic_output.exp 13 Oct 2003 08:02:05 -0000 1.11
+++ tests/debugger/polymorphic_output.exp 2 Apr 2004 08:32:34 -0000
@@ -40,11 +40,11 @@
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^2
-error: cannot change to subterm
+error: there is no subterm 2
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^3
-error: cannot change to subterm
+error: there is no subterm 3
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^r
Index: tests/debugger/polymorphic_output.exp2
===================================================================
RCS file: /home/mercury/mercury1/repository/tests/debugger/polymorphic_output.exp2,v
retrieving revision 1.15
diff -u -b -r1.15 polymorphic_output.exp2
--- tests/debugger/polymorphic_output.exp2 16 Oct 2003 01:36:46 -0000 1.15
+++ tests/debugger/polymorphic_output.exp2 2 Apr 2004 13:08:08 -0000
@@ -40,11 +40,11 @@
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^2
-error: cannot change to subterm
+error: there is no subterm 2
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^3
-error: cannot change to subterm
+error: there is no subterm 3
browser> p
two("three", 3, three("four", 4, "one", 1, empty, empty, empty), two("two", 2, empty, empty))
browser> ^..^r
cvs diff: Diffing tests/debugger/declarative
cvs diff: Diffing tests/dppd
cvs diff: Diffing tests/general
cvs diff: Diffing tests/general/accumulator
cvs diff: Diffing tests/general/string_format
cvs diff: Diffing tests/general/structure_reuse
cvs diff: Diffing tests/grade_subdirs
cvs diff: Diffing tests/hard_coded
cvs diff: Diffing tests/hard_coded/exceptions
cvs diff: Diffing tests/hard_coded/purity
cvs diff: Diffing tests/hard_coded/sub-modules
cvs diff: Diffing tests/hard_coded/typeclasses
cvs diff: Diffing tests/invalid
cvs diff: Diffing tests/invalid/purity
cvs diff: Diffing tests/misc_tests
cvs diff: Diffing tests/mmc_make
cvs diff: Diffing tests/mmc_make/lib
cvs diff: Diffing tests/recompilation
cvs diff: Diffing tests/tabling
cvs diff: Diffing tests/term
cvs diff: Diffing tests/valid
cvs diff: Diffing tests/warnings
cvs diff: Diffing tools
cvs diff: Diffing trace
cvs diff: Diffing util
cvs diff: Diffing vim
cvs diff: Diffing vim/after
cvs diff: Diffing vim/ftplugin
cvs diff: Diffing vim/syntax
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list