[m-rev.] improve & disable foreign_decl_line_number test
Fergus Henderson
fjh at cs.mu.OZ.AU
Wed Sep 4 18:45:22 AEST 2002
Branches: main
Estimated hours taken: 0.75
Improve the tests/invalid/foreign_decl_line_number test case: test more
kinds of foreign interface declarations, and increase the robustness
of the test, by using #error rather than a missing semicolon, and by
filtering the compiler output. This reduces the number of .err_exp*
files needed and avoids spurious failures from warnings in system header
files, etc.
Also disable the test for now, since we don't pass it.
tests/invalid/Mmakefile:
Filter the compiler output for the foreign_decl_line_number test.
Disable the foreign_decl_line_number test.
tests/invalid/foreign_decl_line_number.m:
Use #error rather than a missing semicolon.
Test foreign_proc, foreign_type, and foreign_code.
tests/invalid/foreign_decl_line_number.err_exp:
Update to reflect the new output.
tests/invalid/foreign_decl_line_number.err_exp2:
tests/invalid/foreign_decl_line_number.err_exp3:
Removed.
Workspace: /mnt/ceres/home/ceres/fjh/ws-ceres2/mercury
Index: tests/invalid/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/Mmakefile,v
retrieving revision 1.121
diff -u -d -r1.121 Mmakefile
--- tests/invalid/Mmakefile 2002/09/04 08:31:57 1.121
+++ tests/invalid/Mmakefile 2002/09/04 08:41:03
@@ -136,7 +136,9 @@
vars_in_wrong_places \
with_type
-# we do not yet pass the following tests:
+# XXX we do not yet pass the following tests:
+# foreign_decl_line_number (due to some errors being reported in .c
+# files and .mh files rather than in .m files)
# duplicate_instance_3 (the error is only detected when doing
# normal static linking; the error goes undetected
# when doing dynamic linking, or when the library
@@ -172,6 +174,24 @@
if $(MC) --errorcheck-only $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) $* \
> $*.err 2>&1; \
then false; else true; fi
+
+# For foreign_decl_line_number, the exact output is somewhat dependent
+# on the C compiler, etc. So we just grep the output for "#error" to
+# make sure that it contains the lines that we expect. That way we don't
+# fail this test if there is some additional output (e.g. spurious warnings
+# in system header files). We also pipe the output through `sort -u'
+# to eliminate duplicates; this avoids spurious failures in cases where
+# the C foreign_proc code is inlined by the Mercury compiler.
+# We also pipe it through sed to remove "Mercury/cs/"; this
+# avoids spurious failures with --use-subdirs.
+foreign_decl_line_number.err: foreign_decl_line_number.m
+ if $(MC) --errorcheck-only $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) \
+ foreign_decl_line_number.m \
+ > foreign_decl_line_number.err.orig 2>&1; \
+ then false; else true; fi
+ grep '#error' foreign_decl_line_number.err.orig | \
+ sed 's at Mercury/cs/@@g' | sort -u \
+ > foreign_decl_line_number.err
# For duplicate_instance_{1,2}, the error is only caught at link time.
# So we need to use a different rule for that.
Index: tests/invalid/foreign_decl_line_number.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/foreign_decl_line_number.err_exp,v
retrieving revision 1.1
diff -u -d -r1.1 foreign_decl_line_number.err_exp
--- tests/invalid/foreign_decl_line_number.err_exp 2002/08/05 21:46:22 1.1
+++ tests/invalid/foreign_decl_line_number.err_exp 2002/09/04 08:44:24
@@ -1,5 +1,4 @@
-foreign_decl_line_number.m:18: warning: no semicolon at end of struct or union
-foreign_decl_line_number.m:18: parse error before `int'
-foreign_decl_line_number.m:19: warning: type defaults to `int' in declaration of `bug'
-foreign_decl_line_number.m:19: warning: data definition has no type or storage class
-For more information, try recompiling with `-E'.
+foreign_decl_line_number.m:14: #error Error in foreign decl
+foreign_decl_line_number.m:18: #error Error in foreign code
+foreign_decl_line_number.m:23: #error Error in foreign type
+foreign_decl_line_number.m:34: #error Error in foreign proc
Index: tests/invalid/foreign_decl_line_number.err_exp2
===================================================================
RCS file: foreign_decl_line_number.err_exp2
diff -N foreign_decl_line_number.err_exp2
--- /tmp/cvsoiXQ1E Wed Sep 4 18:44:41 2002
+++ /dev/null Mon Dec 17 21:20:53 2001
@@ -1,6 +0,0 @@
-In file included from foreign_decl_line_number.c:21:
-foreign_decl_line_number.m:18: warning: no semicolon at end of struct or union
-foreign_decl_line_number.m:18: parse error before `int'
-foreign_decl_line_number.m:19: warning: type defaults to `int' in declaration of `bug'
-foreign_decl_line_number.m:19: warning: data definition has no type or storage class
-For more information, try recompiling with `-E'.
Index: tests/invalid/foreign_decl_line_number.err_exp3
===================================================================
RCS file: foreign_decl_line_number.err_exp3
diff -N foreign_decl_line_number.err_exp3
--- /tmp/cvsYrkqkQ Wed Sep 4 18:44:41 2002
+++ /dev/null Mon Dec 17 21:20:53 2001
@@ -1,6 +0,0 @@
-In file included from Mercury/cs/foreign_decl_line_number.c:21:
-foreign_decl_line_number.m:18: warning: no semicolon at end of struct or union
-foreign_decl_line_number.m:18: parse error before `int'
-foreign_decl_line_number.m:19: warning: type defaults to `int' in declaration of `bug'
-foreign_decl_line_number.m:19: warning: data definition has no type or storage class
-For more information, try recompiling with `-E'.
Index: tests/invalid/foreign_decl_line_number.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/foreign_decl_line_number.m,v
retrieving revision 1.1
diff -u -d -r1.1 foreign_decl_line_number.m
--- tests/invalid/foreign_decl_line_number.m 2002/08/05 21:46:23 1.1
+++ tests/invalid/foreign_decl_line_number.m 2002/09/04 08:00:30
@@ -8,14 +8,28 @@
:- implementation.
-main -->
- io__write_string("Hello\n").
+main --> foo(_).
:- pragma foreign_decl("C", "
- /* Missing ; in struct def */
-typedef struct {
- int missing_semicolon_here
- int x;
-} bug;
+#error Error in foreign decl
").
-
+
+:- pragma foreign_code("C", "
+#error Error in foreign code
+").
+
+:- type my_foreign_type.
+:- pragma foreign_type("C", my_foreign_type, "
+#error Error in foreign type
+").
+
+:- pragma export(bar(out,di,uo), "bar").
+:- pred bar(my_foreign_type::out, io::di,io::uo) is det.
+bar(X) --> foo(X).
+
+:- pred foo(my_foreign_type::out, io::di,io::uo) is det.
+:- pragma foreign_proc("C", foo(_output::out, _io0::di, _io::uo),
+ [will_not_call_mercury, promise_pure, thread_safe],
+"
+#error Error in foreign proc
+").
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
The University of Melbourne | of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
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