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
 
