Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision fea7ca72a864654b68ee68c30d09b8423c12bc64)
+++ src/SymTab/Autogen.cc	(revision d8ba08645e3a1d872799a07b1bf581390d8798ce)
@@ -10,5 +10,5 @@
 // Created On       : Thu Mar 03 15:45:56 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 16:58:35 2016
+// Last Modified On : Fri Apr 29 13:11:04 2016
 // Update Count     : 1
 //
@@ -161,20 +161,28 @@
 	}
 
-	/// Creates a new type decl that's the same as src, but renamed and with only the ?=? assertion (for complete types only)
+	/// Creates a new type decl that's the same as src, but renamed and with only the ?=?, ?{} (default and copy), and ^?{} assertions (for complete types only)
 	TypeDecl *cloneAndRename( TypeDecl *src, const std::string &name ) {
 		TypeDecl *dst = new TypeDecl( name, src->get_storageClass(), 0, src->get_kind() );
 
 		if ( src->get_kind() == TypeDecl::Any ) {
-			// just include assignment operator assertion
-			TypeInstType *assignParamType = new TypeInstType( Type::Qualifiers(), name, dst );
-			FunctionType *assignFunctionType = new FunctionType( Type::Qualifiers(), false );
-			assignFunctionType->get_returnVals().push_back(
-				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType->clone(), 0 ) );
-			assignFunctionType->get_parameters().push_back(
-				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), assignParamType->clone() ), 0 ) );
-			assignFunctionType->get_parameters().push_back(
-				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType, 0 ) );
-			FunctionDecl *assignAssert = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignFunctionType, 0, false, false );
+			TypeInstType *opParamType = new TypeInstType( Type::Qualifiers(), name, dst );
+			FunctionType *opFunctionType = new FunctionType( Type::Qualifiers(), false );
+			opFunctionType->get_parameters().push_back(
+				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), opParamType->clone() ), 0 ) );
+			FunctionDecl *ctorAssert = new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, opFunctionType->clone(), 0, false, false );
+			FunctionDecl *dtorAssert = new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, opFunctionType->clone(), 0, false, false );
+
+			opFunctionType->get_parameters().push_back(
+				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, opParamType, 0 ) );
+			FunctionDecl *copyCtorAssert = new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, opFunctionType->clone(), 0, false, false );
+
+			opFunctionType->get_returnVals().push_back(
+				new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, opParamType->clone(), 0 ) );
+			FunctionDecl *assignAssert = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, opFunctionType, 0, false, false );
+
 			dst->get_assertions().push_back( assignAssert );
+			dst->get_assertions().push_back( ctorAssert );
+			dst->get_assertions().push_back( dtorAssert );
+			dst->get_assertions().push_back( copyCtorAssert );
 		}
 
@@ -187,4 +195,8 @@
 			field = field->clone();
 			genericSubs.apply( field );
+
+			if ( src ) {
+				genericSubs.apply( src );
+			}
 		}
 
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision fea7ca72a864654b68ee68c30d09b8423c12bc64)
+++ src/SynTree/TypeSubstitution.h	(revision d8ba08645e3a1d872799a07b1bf581390d8798ce)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 11:15:07 2016
+// Last Modified On : Fri Apr 29 13:50:09 2016
 // Update Count     : 2
 //
@@ -152,4 +152,5 @@
 template< typename TypeInstListIterator >
 void TypeSubstitution::extract( TypeInstListIterator begin, TypeInstListIterator end, TypeSubstitution &result ) {
+	// xxx - this function doesn't extract varEnv - is this intentional?
 	while ( begin != end ) {
 		TypeEnvType::iterator cur = typeEnv.find( (*begin++)->get_name() );
