Index: src/Common/GC.cc
===================================================================
--- src/Common/GC.cc	(revision 04570c75d205118d854a3167b93c28cd2c63f51d)
+++ src/Common/GC.cc	(revision 24de7b1695ec2b0f72713eb9c21700d888488dde)
@@ -40,5 +40,5 @@
 }
 
-const GC& GC::operator<< (const GC_Traceable* obj) const {
+const GC& GC::operator<< (const GC_Object* obj) const {
 	if( obj )
 	{
@@ -119,4 +119,12 @@
 }
 
+GC_Object::GC_Object( const GC_Object& ) {
+	GC::get().register_object( this );
+}
+
+GC_Object::GC_Object( GC_Object&& ) {
+	GC::get().register_object( this );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/Common/GC.h
===================================================================
--- src/Common/GC.h	(revision 04570c75d205118d854a3167b93c28cd2c63f51d)
+++ src/Common/GC.h	(revision 24de7b1695ec2b0f72713eb9c21700d888488dde)
@@ -18,5 +18,4 @@
 #include <vector>
 
-class GC_Traceable;
 class GC_Object;
 class BaseSyntaxNode;
@@ -30,5 +29,5 @@
 
 	/// Traces a traceable object
-	const GC& operator<< (const GC_Traceable*) const;
+	const GC& operator<< (const GC_Object*) const;
 
 	/// Adds a new object to garbage collection
@@ -111,21 +110,26 @@
 }
 
-/// Class that is traced by the GC, but not managed by it
-class GC_Traceable {
+/// Class that is managed by the GC
+class GC_Object {
 	friend class GC;
 protected:
 	mutable bool mark;
 
+	// Override default constructors to ensure clones are registered and properly marked
+	GC_Object();
+
+	GC_Object(const GC_Object&);
+
+	GC_Object(GC_Object&&);
+
+	GC_Object& operator= (const GC_Object&) { /* do not assign mark */ return *this; }
+
+	GC_Object& operator= (GC_Object&&) { /* do not assign mark */ return *this; }
+
+	// Ensure subclasses can be deleted by garbage collector
+	virtual ~GC_Object() {}
+
 	/// override to trace any child objects
 	virtual void trace(const GC&) const {}
-};
-
-/// Class that is managed by the GC
-class GC_Object : public GC_Traceable {
-	friend class GC;
-protected:
-	virtual ~GC_Object() {}
-public:
-	GC_Object();
 };
 
