Index: src/examples/gc_no_raii/src/gc.h
===================================================================
--- src/examples/gc_no_raii/src/gc.h	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/src/gc.h	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -2,8 +2,12 @@
 
 #include "gcpointers.h"
+#include "internal/collector.h"
 
-// forall( dtype T )
-// gcpointer_t gcmalloc()
-// {
-//
-// }
+forall(otype T)
+static inline gcpointer(T) gcmalloc()
+{
+    gcpointer(T) test;
+    // ctor(&test, gc_allocate(sizeof(T)));
+    // gc_conditional_collect();
+    return test;
+}
Index: src/examples/gc_no_raii/src/gcpointers.c
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.c	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/src/gcpointers.c	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -84,15 +84,15 @@
 
 //Logical operators
-int gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs)
+bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs)
 {
 	return this->ptr == rhs->ptr;
 }
 
-int gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs)
+bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs)
 {
 	return this->ptr != rhs->ptr;
 }
 
-int gcpointer_null(gcpointer_t* this)
+bool gcpointer_null(gcpointer_t* this)
 {
 	return this->ptr == (intptr_t)NULL;
Index: src/examples/gc_no_raii/src/gcpointers.h
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.h	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/src/gcpointers.h	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -1,4 +1,5 @@
 #pragma once
 
+#include <stdbool.h>
 #include <stdint.h>
 
@@ -10,14 +11,76 @@
 
 void gcpointer_ctor(gcpointer_t* this);
-void gcpointer_ctor(gcpointer_t* ptr, int null);
 void gcpointer_ctor(gcpointer_t* this, void* address);
 void gcpointer_ctor(gcpointer_t* this, gcpointer_t* other);
-
 void gcpointer_dtor(gcpointer_t* this);
-
 gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs);
 
 //Logical operators
-int gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs);
-int gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs);
-int gcpointer_null(gcpointer_t* this);
+bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs);
+bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs);
+bool gcpointer_null(gcpointer_t* this);
+
+forall(otype T)
+struct gcpointer
+{
+	gcpointer_t internal;
+};
+
+forall(otype T)
+static inline void ctor(gcpointer(T)* this)
+{
+	gcpointer_ctor(&this->internal);
+}
+
+// forall(otype T)
+// static inline void ctor(gcpointer(T)* this, int null)
+// {
+// 	gcpointer_ctor(&this->internal, NULL);
+// }
+
+forall(otype T)
+static inline void ctor(gcpointer(T)* this, void* address)
+{
+	gcpointer_ctor(&this->internal, address);
+}
+
+forall(otype T)
+static inline void ctor(gcpointer(T)* this, gcpointer(T)* other)
+{
+	gcpointer_ctor(&this->internal, other);
+}
+
+forall(otype T)
+static inline void dtor(gcpointer(T)* this)
+{
+	gcpointer_dtor(&this->internal);
+}
+
+forall(otype T)
+static inline gcpointer(T)* ?=?(gcpointer(T)* this, gcpointer(T)* rhs)
+{
+	gcpointer_assign(&this->internal, &rhs->internal);
+	return this;
+}
+
+forall(otype T)
+static inline T *?(gcpointer(T) this)
+{
+	return *(T*)this.internal.ptr;
+}
+
+//Logical operators
+forall(otype T)
+static inline int ?!=?(gcpointer(T) this, gcpointer(T) rhs)
+{
+	return this.internal.ptr != rhs.internal.ptr;
+}
+
+forall(otype T)
+static inline int ?==?(gcpointer(T) this, gcpointer(T) rhs)
+{
+	return !(this == rhs);
+}
+
+forall(otype T)
+extern struct gcpointer(T) 0;
Index: src/examples/gc_no_raii/src/test_include.c
===================================================================
--- src/examples/gc_no_raii/src/test_include.c	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/src/test_include.c	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -2,4 +2,3 @@
 #define xstr(s) sstr(s)
 #define sstr(s) #s
-#error "test" # xstr(TEST_FILE.c)
-#include "test" # xstr(TEST_FILE.c)
+#include xstr(../test/TEST_FILE.c)
Index: src/examples/gc_no_raii/src/vector.h
===================================================================
--- src/examples/gc_no_raii/src/vector.h	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/src/vector.h	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -1,4 +1,5 @@
 #pragma once
 
+#include <stdbool.h>
 #include <stdlib>
 
Index: src/examples/gc_no_raii/test/badlll.c
===================================================================
--- src/examples/gc_no_raii/test/badlll.c	(revision 273080fde491d7a6794d14462b05fda5b6eae6e6)
+++ src/examples/gc_no_raii/test/badlll.c	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -6,2 +6,21 @@
 	int val;
 };
+
+typedef gcpointer(List_t) LLL;
+
+#define MAX (1024 * 1024)
+
+LLL buildLLL(int sz)
+{
+	int i;
+	LLL ll0, lll, llc;
+	ctor(&ll0);
+	ctor(&lll);
+	ctor(&llc);
+
+	ll0 = gcmalloc();
+	ll0->val = 0;
+	lll = ll0;
+
+	return ll0;
+}
Index: src/examples/gc_no_raii/test/operators.c
===================================================================
--- src/examples/gc_no_raii/test/operators.c	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
+++ src/examples/gc_no_raii/test/operators.c	(revision f1e42c1236cf4e3991e702a5c4af55e770ff0aa1)
@@ -0,0 +1,22 @@
+#include "gc.h"
+
+#include <assert.h>
+
+int main(int argc, char *argv[])
+{
+	gcpointer(int) test, test1;
+
+	if(test != test1) { return 1; }
+	if(test == test1) { return 1; }
+	// if(test == 0)  { return 1; }
+	// if(test != 0)  { return 1; }
+	// if(test) { return 1; }
+
+	// *test.internal.ptr = 3;
+	// int i = *test;
+
+	gcmalloc();
+	// test = gcmalloc();
+
+	return 0;
+}
