Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 67b11805a9c9b0a267280de939d17212697a3732)
+++ src/SymTab/Autogen.cc	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -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 );
+			}
 		}
 
