diff --git a/mps/code/finalcv.c b/mps/code/finalcv.c
index 6f55e518cd4..1871141bbdf 100644
--- a/mps/code/finalcv.c
+++ b/mps/code/finalcv.c
@@ -1,7 +1,7 @@
/* finalcv.c: FINALIZATION COVERAGE TEST
*
* $Id$
- * Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
+ * Copyright (c) 2001-2018 Ravenbrook Limited. See end of file for license.
* Portions copyright (C) 2002 Global Graphics Software.
*
* DESIGN
@@ -143,6 +143,10 @@ static void test(mps_arena_t arena, mps_pool_class_t pool_class)
/* store index in vector's slot */
((mps_word_t *)p)[vectorSLOT] = dylan_int(i);
+ /* mps_definalize fails when there have been no calls to mps_finalize
+ yet, or for an address that was not registered for finalization. */
+ Insist(mps_definalize(arena, &p) == MPS_RES_FAIL);
+
die(mps_finalize(arena, &p), "finalize\n");
root[i] = p; state[i] = rootSTATE;
}
@@ -246,7 +250,7 @@ int main(int argc, char *argv[])
/* C. COPYRIGHT AND LICENSE
*
- * Copyright (c) 2001-2016 Ravenbrook Limited .
+ * Copyright (c) 2001-2018 Ravenbrook Limited .
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*
diff --git a/mps/test/argerr/155.c b/mps/test/argerr/155.c
new file mode 100644
index 00000000000..9f1228b7750
--- /dev/null
+++ b/mps/test/argerr/155.c
@@ -0,0 +1,31 @@
+/*
+TEST_HEADER
+ id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $
+ summary = finalize address not managed by the arena
+ language = c
+ link = testlib.o
+OUTPUT_SPEC
+ assert = true
+ assertfile P= global.c
+ assertcond = PoolOfAddr(&refpool, arena, (Addr)obj)
+END_HEADER
+*/
+
+#include "testlib.h"
+#include "mps.h"
+
+static void test(void)
+{
+ void *p = &p;
+ mps_arena_t arena;
+ cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none),
+ "create arena");
+ mps_finalize(arena, &p);
+ mps_arena_destroy(arena);
+}
+
+int main(void)
+{
+ easy_tramp(test);
+ return 0;
+}
diff --git a/mps/test/argerr/156.c b/mps/test/argerr/156.c
new file mode 100644
index 00000000000..1b9c0e8aae1
--- /dev/null
+++ b/mps/test/argerr/156.c
@@ -0,0 +1,31 @@
+/*
+TEST_HEADER
+ id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $
+ summary = definalize address not managed by the arena
+ language = c
+ link = testlib.o
+OUTPUT_SPEC
+ assert = true
+ assertfile P= global.c
+ assertcond = ArenaHasAddr(arena, (Addr)obj)
+END_HEADER
+*/
+
+#include "testlib.h"
+#include "mps.h"
+
+static void test(void)
+{
+ void *p = &p;
+ mps_arena_t arena;
+ cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none),
+ "create arena");
+ mps_definalize(arena, &p);
+ mps_arena_destroy(arena);
+}
+
+int main(void)
+{
+ easy_tramp(test);
+ return 0;
+}
diff --git a/mps/test/argerr/157.c b/mps/test/argerr/157.c
new file mode 100644
index 00000000000..d08e079c75e
--- /dev/null
+++ b/mps/test/argerr/157.c
@@ -0,0 +1,37 @@
+/*
+TEST_HEADER
+ id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $
+ summary = finalize address in manually managed pool
+ language = c
+ link = testlib.o
+OUTPUT_SPEC
+ assert = true
+ assertfile P= global.c
+ assertcond = PoolHasAttr(refpool, AttrGC)
+END_HEADER
+*/
+
+#include "testlib.h"
+#include "mps.h"
+#include "mpscmvff.h"
+
+static void test(void)
+{
+ void *p;
+ mps_arena_t arena;
+ mps_pool_t pool;
+ cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none),
+ "create arena");
+ cdie(mps_pool_create_k(&pool, arena, mps_class_mvff(), mps_args_none),
+ "create pool");
+ cdie(mps_alloc(&p, pool, 16), "alloc");
+ mps_finalize(arena, &p);
+ mps_pool_destroy(pool);
+ mps_arena_destroy(arena);
+}
+
+int main(void)
+{
+ easy_tramp(test);
+ return 0;
+}