Index: src/Common/GC.cc
===================================================================
--- src/Common/GC.cc	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/Common/GC.cc	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -23,6 +23,4 @@
 #include <cassert>
 
-// #include <csignal>
-
 GC& GC::get() {
 	static GC gc;
@@ -47,6 +45,5 @@
 	if( obj )
 	{
-		bool isMarked = obj->mark == this->mark;
-		if( !isMarked ) {
+		if( obj->mark != this->mark ) {
 			obj->mark = this->mark;
 			obj->trace( *this );
@@ -57,7 +54,6 @@
 
 void GC::register_object(GC_Object* obj) {
-	// if ( obj == (GC_Object*)0x60f00000e410ul ) std::raise( SIGTRAP );
 	(using_young ? young : old).push_back(obj);
-	obj->mark = ! this->mark;  // initialize as un-marked
+	obj->mark = !this->mark;  // initialize as un-marked
 }
 
@@ -67,5 +63,8 @@
 
 void GC::new_generation() {
-	using_young = true;
+	assert(!using_young && "Cannot start new generation when young generation already in use");
+	
+	using_young = true;  // mark young generation as in-use
+	mark = !mark;        // switch mark so aged young objects will still be unmarked in old
 }
 
@@ -78,10 +77,4 @@
 
 void GC::collect_young() {
-	// check young generation, just reset mark if not using
-	if ( ! using_young ) {
-		mark = !mark;
-		return;
-	}
-
 	// collect young gen
 	for ( GC_Object*& obj : young ) {
@@ -100,13 +93,15 @@
 	young.clear();
 
-	// reset mark for next collection
+	// reset mark to return to old generation mark
 	mark = !mark;
 }
 
 void GC::collect() {
+	// ensure not called when young gen is active
+	assert(!using_young && "Cannot do old collection when young generation is active");
+
 	// collect old gen
 	for ( GC_Object*& obj : old ) {
 		if ( obj->mark != mark ) {
-			// if ( obj == (GC_Object*)0x60f00000e410ul ) std::raise( SIGTRAP );
 			delete obj;
 			obj = nullptr;
@@ -117,6 +112,6 @@
 	old.erase( std::remove( old.begin(), old.end(), nullptr ), old.end() );
 
-	// collect young gen (also resets mark)
-	collect_young();
+	// reset mark
+	mark = !mark;
 }
 
Index: src/Common/GC.h
===================================================================
--- src/Common/GC.h	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/Common/GC.h	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -48,5 +48,6 @@
 	void collect_young();
 
-	/// Collects all memory; use old generation afterward.
+	/// Collects old generation; use old generation afterward.
+	/// Error if currently using young generation
 	void collect();
 
Index: src/ResolvExpr/Alternative.cc
===================================================================
--- src/ResolvExpr/Alternative.cc	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/ResolvExpr/Alternative.cc	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -20,8 +20,11 @@
 #include <utility>                       // for move
 
+#include "Common/GC.h"
+#include "Common/PassVisitor.h"
 #include "Common/utility.h"              // for maybeClone
 #include "ResolvExpr/Cost.h"             // for Cost, Cost::zero, operator<<
 #include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
 #include "SynTree/Expression.h"          // for Expression
+#include "SynTree/GcTracer.h"
 #include "SynTree/Type.h"                // for Type
 
@@ -64,4 +67,11 @@
 	}
 
+	const GC& operator<< ( const GC& gc, const Alternative& alt ) {
+		PassVisitor<GcTracer> tracer{ gc };
+		maybeAccept( alt.expr, tracer );
+		tracer << alt.env;
+		return gc;
+	}
+
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/ResolvExpr/Alternative.h	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -23,4 +23,6 @@
 
 class Expression;
+
+class GC;
 
 namespace ResolvExpr {
@@ -52,4 +54,6 @@
 		return os;
 	}
+
+	const GC& operator<< ( const GC&, const Alternative& );
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/ResolvExpr/Resolver.cc	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -22,4 +22,5 @@
 #include "Alternative.h"                 // for Alternative, AltList
 #include "AlternativeFinder.h"           // for AlternativeFinder, resolveIn...
+#include "Common/GC.h"                   // for new_generation, collect_young
 #include "Common/PassVisitor.h"          // for PassVisitor
 #include "Common/SemanticError.h"        // for SemanticError
@@ -146,4 +147,7 @@
 		void findUnfinishedKindExpression(Expression * untyped, Alternative & alt, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, bool adjust = false, bool prune = true, bool failFast = true) {
 			assertf( untyped, "expected a non-null expression." );
+
+			new_generation();  // set up GC young generation for this top-level expression
+
 			TypeEnvironment env;
 			AlternativeFinder finder( indexer, env );
@@ -173,11 +177,17 @@
 			findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) );
 			if ( winners.size() == 0 ) {
-				SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") );
+				collect_young();
+				SemanticError( untyped, toString( 
+					"No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), 
+					"expression: ") );
 			} else if ( winners.size() != 1 ) {
 				std::ostringstream stream;
-				stream << "Cannot choose between " << winners.size() << " alternatives for " << kindStr << (kindStr != "" ? " " : "") << "expression\n";
+				stream << "Cannot choose between " << winners.size() << " alternatives for " 
+					<< kindStr << (kindStr != "" ? " " : "") << "expression\n";
 				untyped->print( stream );
 				stream << " Alternatives are:\n";
 				printAlts( winners, stream, 1 );
+				
+				collect_young();
 				SemanticError( untyped->location, stream.str() );
 			}
@@ -186,7 +196,10 @@
 			Alternative & choice = winners.front();
 			if ( findDeletedExpr( choice.expr ) ) {
-				SemanticError( choice.expr, "Unique best alternative includes deleted identifier in " );
+				collect_young( choice.expr );
+				SemanticError( choice.expr, 
+					"Unique best alternative includes deleted identifier in " );
 			}
 			alt = std::move( choice );
+			collect_young( alt );
 		}
 
Index: src/ResolvExpr/TypeEnvironment.cc
===================================================================
--- src/ResolvExpr/TypeEnvironment.cc	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/ResolvExpr/TypeEnvironment.cc	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -19,5 +19,7 @@
 #include <utility>                     // for pair
 
+#include "Common/PassVisitor.h"        // for PassVisitor<GcTracer>
 #include "Common/utility.h"            // for maybeClone
+#include "SynTree/GcTracer.h"          // for PassVisitor<GcTracer>
 #include "SynTree/Type.h"              // for Type, FunctionType, Type::Fora...
 #include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
@@ -222,4 +224,11 @@
 		return out;
 	}
+
+	PassVisitor<GcTracer> & operator<<( PassVisitor<GcTracer> & gc, const TypeEnvironment & env ) {
+		for ( const EqvClass & c : env ) {
+			maybeAccept( c.type, gc );
+		}
+		return gc;
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/TypeEnvironment.h
===================================================================
--- src/ResolvExpr/TypeEnvironment.h	(revision 09a1ae65b16a0d81b5e42e0db3d06d4ae0941448)
+++ src/ResolvExpr/TypeEnvironment.h	(revision f229fc21dea2ccacb291a92a65e5b8c8fab587c0)
@@ -26,4 +26,8 @@
 #include "SynTree/Type.h"              // for Type, Type::ForallList
 #include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
+
+template< typename Pass >
+class PassVisitor;
+class GcTracer;
 
 namespace ResolvExpr {
@@ -116,4 +120,6 @@
 
 	std::ostream & operator<<( std::ostream & out, const TypeEnvironment & env );
+
+	PassVisitor<GcTracer> & operator<<( PassVisitor<GcTracer> & gc, const TypeEnvironment & env );
 } // namespace ResolvExpr
 
