Index: src/Common/GC.cc
===================================================================
--- src/Common/GC.cc	(revision 7e4b44db4aee3e4db9e5c3f78521d2db85fd048b)
+++ src/Common/GC.cc	(revision bd06384ff9b3300e1d878bc19523e6051209bb15)
@@ -16,4 +16,8 @@
 #include "GC.h"
 
+#include "Common/PassVisitor.h"
+
+#include "SynTree/GcTracer.h"
+
 #include <algorithm>
 #include <cassert>
@@ -24,5 +28,5 @@
 }
 
-GC::GC() : mark(false), old(), young(), using_young(false) {
+GC::GC() : mark(false), using_young(false), old(), young(), static_roots() {
 	old.reserve(70000);
 }
@@ -55,6 +59,17 @@
 }
 
+void GC::register_static_root(BaseSyntaxNode* root) {
+	static_roots.push_back(root);
+}
+
 void GC::new_generation() {
 	using_young = true;
+}
+
+void GC::trace_static_roots() {
+	PassVisitor<GcTracer> tracer{ *this };
+	for ( BaseSyntaxNode* root : static_roots ) {
+		root->accept( tracer );
+	}
 }
 
Index: src/Common/GC.h
===================================================================
--- src/Common/GC.h	(revision 7e4b44db4aee3e4db9e5c3f78521d2db85fd048b)
+++ src/Common/GC.h	(revision bd06384ff9b3300e1d878bc19523e6051209bb15)
@@ -20,4 +20,5 @@
 class GC_Traceable;
 class GC_Object;
+class BaseSyntaxNode;
 
 /// Manually traced and called garbage collector
@@ -34,6 +35,12 @@
 	void register_object(GC_Object*);
 
+	/// Adds an object to the set of static roots
+	void register_static_root(BaseSyntaxNode*);
+
 	/// Use young generation for subsequent new objects
 	void new_generation();
+
+	/// Traces all static roots
+	void trace_static_roots();
 
 	/// Collects the young generation, placing survivors in old generation.
@@ -50,11 +57,13 @@
 	GC();
 
-	/// The current collection's mark bit
-	bool mark;
+	bool mark;                 ///< The current collection's mark bit
+	bool using_young;          ///< Is the young generation in use?
 
-	typedef std::vector<class GC_Object*> Generation;
-	Generation old;
-	Generation young;
-	bool using_young;
+	using Generation = std::vector<GC_Object*>;
+	Generation old;            ///< Old generation
+	Generation young;          ///< Young generation
+
+	using StaticRoots = std::vector<BaseSyntaxNode*>;
+	StaticRoots static_roots;  ///< Set of static-lifetime roots
 };
 
@@ -80,4 +89,5 @@
 	GC& gc = GC::get();
 	traceAll(gc, roots...);
+	gc.trace_static_roots();
 	gc.collect_young();
 }
@@ -88,5 +98,14 @@
 	GC& gc = GC::get();
 	traceAll(gc, roots...);
+	gc.trace_static_roots();
 	gc.collect();
+}
+
+/// Makes a new expression as a static root
+template<typename T, typename... Args>
+inline T* new_static_root( Args&&... args ) {
+	T* root = new T( std::forward<Args>(args)... );
+	GC::get().register_static_root( root );
+	return root;
 }
 
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 7e4b44db4aee3e4db9e5c3f78521d2db85fd048b)
+++ src/Common/PassVisitor.impl.h	(revision bd06384ff9b3300e1d878bc19523e6051209bb15)
@@ -38,5 +38,5 @@
 	MUTATE_END( type, node );      \
 
-
+#include "Common/GC.h"
 
 template<typename T>
@@ -397,10 +397,10 @@
 			auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
 			// implicit add __func__ identifier as specified in the C manual 6.4.2.2
-			static ObjectDecl func(
+			static ObjectDecl* func = new_static_root<ObjectDecl>(
 				"__func__", noStorageClasses, LinkageSpec::C, nullptr,
 				new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),
 				nullptr
 			);
-			indexerAddId( &func );
+			indexerAddId( func );
 			maybeAccept_impl( node->type, *this );
 			maybeAccept_impl( node->statements, *this );
@@ -427,10 +427,10 @@
 			auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
 			// implicit add __func__ identifier as specified in the C manual 6.4.2.2
-			static ObjectDecl func(
+			static ObjectDecl* func = new_static_root<ObjectDecl>(
 				"__func__", noStorageClasses, LinkageSpec::C, nullptr,
 				new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),
 				nullptr
 			);
-			indexerAddId( &func );
+			indexerAddId( func );
 			maybeMutate_impl( node->type, *this );
 			maybeMutate_impl( node->statements, *this );
