Index: src/Validate/ForallPointerDecay.cpp
===================================================================
--- src/Validate/ForallPointerDecay.cpp	(revision 51b858208ac4ba1dd63af02aa6f808536839b22a)
+++ src/Validate/ForallPointerDecay.cpp	(revision 40a606d2c7b826dafaa8f9aec47556b5b57893ac)
@@ -82,4 +82,5 @@
 			(void)count;
 
+			// Update the type (type substution does not seem to cover it).
 			if ( auto func = copy.as<ast::FunctionDecl>() ) {
 				auto mut = ast::mutate( func );
@@ -118,58 +119,4 @@
 	}
 
-	static AssertionList expandTrait_DR(
-			const TypeDeclVec & typeDecls, const ast::TraitInstType * inst ) {
-		assertf( inst->base, "Trait instance not linked to base trait: %s",
-			toCString( inst ) );
-		AssertionList assertions;
-		assertf( inst->params.size() == inst->base->params.size(),
-			"Trait instance has incorrect number of params: %s",
-			toCString( inst ) );
-		// Replace the TypeDecls that used to point to the trait.
-		ast::DeclReplacer::TypeMap typeMap;
-		for ( size_t i = 0 ; i < inst->params.size() ; ++i ) {
-			typeMap[ inst->base->params[i].get() ] = typeDecls[i].get();
-		}
-		for ( const ast::ptr<ast::Decl> & decl : inst->base->members ) {
-			auto copy = strict_dynamic_cast<const ast::DeclWithType *>(
-				ast::DeclReplacer::replace(
-					ast::deepCopy( decl.get() ), typeMap ) );
-			// TODO: Does DeclReplacer make this redundent?
-			if ( auto func = dynamic_cast<const ast::FunctionDecl *>(copy) ) {
-				auto mut = ast::mutate( func );
-				mut->type = makeFuncType( func );
-				copy = mut;
-			}
-			assertions.push_back( copy );
-		}
-		return assertions;
-	}
-
-	static AssertionList expandAssertions_DR(
-			const TypeDeclVec & typeDecls, const AssertionList & assertions ) {
-		AssertionList newAsserts;
-		for ( const ast::ptr<ast::DeclWithType> & assert : assertions ) {
-			if ( auto traitInst = dynamic_cast<const ast::TraitInstType *>(
-					assert->get_type() ) ) {
-				auto moreAsserts = expandTrait_DR( typeDecls, traitInst );
-				append( newAsserts, moreAsserts );
-			} else {
-				newAsserts.push_back( assert );
-			}
-		}
-		return newAsserts;
-	}
-
-	// They had better all be unique for this to work.
-	static TypeDeclVec expandTypeDecls_DR( const TypeDeclVec & old ) {
-		TypeDeclVec typeDecls;
-		for ( const ast::TypeDecl * typeDecl : old ) {
-			typeDecls.push_back( ast::mutate_field( typeDecl,
-				&ast::TypeDecl::assertions,
-				expandAssertions_DR( old, typeDecl->assertions ) ) );
-		}
-		return typeDecls;
-	}
-
 	const ast::FunctionDecl * postvisit( const ast::FunctionDecl * decl ) {
 		if ( decl->assertions.empty() ) {
@@ -178,20 +125,6 @@
 		auto mut = ast::mutate( decl );
 		mut->assertions = expandAssertions( decl->assertions );
+		// Update the assertion list on the type as well.
 		auto mutType = ast::mutate( mut->type.get() );
-		// *
-		mutType->params.clear();
-		for ( auto & param : mut->params ) {
-			mutType->params.emplace_back( param->get_type() );
-		}
-		mutType->returns.clear();
-		for ( auto & ret : mut->returns ) {
-			mutType->returns.emplace_back( ret->get_type() );
-		}
-		mutType->forall.clear();
-		for ( auto & type_param : mut->type_params ) {
-			mutType->forall.emplace_back(
-				new ast::TypeInstType( type_param->name, type_param ) );
-		}
-		// * /
 		mutType->assertions.clear();
 		for ( auto & assertion : mut->assertions ) {
