Index: src/examples/gc_no_raii/src/gcpointers.c
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.c	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/gcpointers.c	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -25,5 +25,6 @@
 		check(obj);
 		check(is_valid(obj));
-		check(gc_is_managed(this) == gc_is_managed(obj->root_chain) || !obj->root_chain);
+		check(!obj->root_chain || this->ptr == obj->root_chain->ptr);
+		check(!obj->root_chain || gc_is_managed(this) == gc_is_managed(obj->root_chain));
 		this->next = obj->root_chain;
 		obj->root_chain = this;
@@ -69,16 +70,11 @@
 }
 
-gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs)
+gcpointer_t ?=?(gcpointer_t* this, gcpointer_t rhs)
 {
-	if(this != rhs)
-	{
-		unregister_ptr(this);
+	unregister_ptr(this);
+	this->ptr = rhs.ptr;
+	register_ptr(this);
 
-		this->ptr = rhs->ptr;
-
-		register_ptr(this);
-	}
-
-	return this;
+	return *this;
 }
 
@@ -107,6 +103,6 @@
 }
 
-forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T)* other) {
-	(&this->internal) { other->internal };
+forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other) {
+	(&this->internal) { other.internal };
 }
 
@@ -115,5 +111,8 @@
 }
 
-// forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs);
+forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs) {
+	this->internal = rhs.internal;
+	return *this;
+}
 //
 // forall(otype T) T *?(gcpointer(T) this);
Index: src/examples/gc_no_raii/src/gcpointers.h
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.h	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/gcpointers.h	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -33,5 +33,5 @@
 forall(otype T) void ?{}(gcpointer(T)* this);
 forall(otype T) void ?{}(gcpointer(T)* this, void* address);
-forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T)* other);
+forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other);
 forall(otype T) void ^?{}(gcpointer(T)* this);
 forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs);
Index: src/examples/gc_no_raii/src/internal/card_table.h
===================================================================
--- src/examples/gc_no_raii/src/internal/card_table.h	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/card_table.h	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -7,4 +7,5 @@
 {
 	size_t card = ( ((intptr_t)address) & CARDS_OFFSET_MASK ) >> CARDS_SIZE_EXP;
+	checkf(card < CARDS_COUNT, (const char*)"%lu %lu = (%lx & %lx) >> %lu\n", (size_t)CARDS_COUNT, (size_t)card, (size_t)address, (size_t)CARDS_OFFSET_MASK, (size_t)CARDS_SIZE_EXP);
 	check(card < CARDS_COUNT);
 	return card;
Index: src/examples/gc_no_raii/src/internal/collector.h
===================================================================
--- src/examples/gc_no_raii/src/internal/collector.h	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/collector.h	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -1,5 +1,5 @@
 #pragma once
 
-#include <stdlib>
+#include <stdlib.h>
 
 #include "tools.h"
Index: src/examples/gc_no_raii/src/internal/memory_pool.c
===================================================================
--- src/examples/gc_no_raii/src/internal/memory_pool.c	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/memory_pool.c	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -87,5 +87,4 @@
 	intptr_t member_add = (intptr_t)member;
 	intptr_t start_obj;
-	intptr_t start_obj_add;
 
 	do
@@ -95,7 +94,6 @@
 		check(card != 0 || start_obj);
 		card--;
-		start_obj_add = (intptr_t)start_obj;
 	}
-	while(start_obj_add > member_add || start_obj_add != 0);
+	while(start_obj > member_add || !(start_obj));
 
 	check( start_obj );
Index: src/examples/gc_no_raii/src/internal/object_header.c
===================================================================
--- src/examples/gc_no_raii/src/internal/object_header.c	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/object_header.c	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -90,5 +90,5 @@
 		while(root)
 		{
-			check(gc_get_object_ptr( (void*)root->ptr ) == this);
+			checkf(gc_get_object_ptr( (void*)root->ptr ) == this, (const char*)"Expected %lX got %lX\n", gc_get_object_ptr( (void*)root->ptr ), this);
 
 			root = root->next;
@@ -106,3 +106,5 @@
 		return true;
 	}
+	#else
+	#error blarg
 #endif
Index: src/examples/gc_no_raii/src/internal/object_header.h
===================================================================
--- src/examples/gc_no_raii/src/internal/object_header.h	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/object_header.h	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -49,4 +49,4 @@
 
 #ifndef NDEBUG
-	bool is_valid( struct gc_object_header* obj );
+	bool is_valid(const gc_object_header* const this);
 #endif
Index: src/examples/gc_no_raii/src/internal/state.c
===================================================================
--- src/examples/gc_no_raii/src/internal/state.c	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/src/internal/state.c	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -76,14 +76,21 @@
 gc_object_header* gc_get_object_for_ref(gc_state* state, void* member)
 {
+	volatile int stage = 0;
 	intptr_t target = ((intptr_t)member);
 	if(!gc_is_in_heap(state, member)) return NULL;
+	stage++;
 
 	gc_memory_pool* pool = gc_pool_of(member);
+	stage++;
 	gc_pool_object_iterator it = gc_pool_iterator_for(pool, member);
+	stage++;
 	gc_pool_object_iterator end = end(pool);
+	stage++;
 
 	while(it != end)
 	{
 		gc_object_header* object = *it;
+		check(object);
+		check( is_valid(object) );
 		{
 			intptr_t start = ((intptr_t)object);
@@ -94,4 +101,5 @@
 			}
 		}
+		stage++;
 		++it;
 	}
@@ -273,5 +281,9 @@
 			}
 
-			check(size + gc_pool_size_used(pool) == gc_pool_size_total(pool));
+			checkf(size + gc_pool_size_left(pool) == gc_pool_size_total(pool),
+				(const char*)"expected %lu + %lu == %lu\n",
+				(size_t)size,
+				(size_t)gc_pool_size_left(pool),
+				(size_t)gc_pool_size_total(pool));
 
 			pool = pool->next;
Index: src/examples/gc_no_raii/test/badlll.c
===================================================================
--- src/examples/gc_no_raii/test/badlll.c	(revision 4ed70597f55cf4d141df0e03cc994430a3b4182c)
+++ src/examples/gc_no_raii/test/badlll.c	(revision 76af36f4a9e47a83d4e2a30ce79b4fda2dd395e7)
@@ -11,18 +11,19 @@
 typedef gcpointer(List_t) LLL;
 
-#define MAX (1024 * 1024)
+#define MAX (1024 * 1)
 
 LLL buildLLL(int sz)
 {
 	int i = 0;
-	LLL ll0, lll, llc;
+	LLL ll0;
 
 	gcmalloc( &ll0 );
 	List_t* ll0_ptr = get( &ll0 );
 	ll0_ptr->val = i;
-	lll = ll0;
+	LLL lll = ll0;
 
 	for (i = 1; i < sz; i++)
 	{
+		LLL llc;
 		gcmalloc( &llc );
 		List_t* llc_ptr = get( &llc );
