[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