Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 447c35601995880f86baa595fb0755c65564b620)
+++ src/InitTweak/InitTweak.cc	(revision 6fc5c14c6f831f36aaf4f6736da31f67985da917)
@@ -353,9 +353,9 @@
 			assert( expr );
 			if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) {
-				return varExpr->get_var();
+				return varExpr->var;
 			} else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( expr ) ) {
-				return memberExpr->get_member();
+				return memberExpr->member;
 			} else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
-				return getCalledFunction( castExpr->get_arg() );
+				return getCalledFunction( castExpr->arg );
 			} else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * >( expr ) ) {
 				return handleDerefCalledFunction( untypedExpr );
@@ -363,5 +363,7 @@
 				return handleDerefCalledFunction( appExpr );
 			} else if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
-				return getCalledFunction( addrExpr->get_arg() );
+				return getCalledFunction( addrExpr->arg );
+			} else if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( expr ) ) {
+				return getCalledFunction( commaExpr->arg2 );
 			}
 			return nullptr;
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 447c35601995880f86baa595fb0755c65564b620)
+++ src/SymTab/Autogen.cc	(revision 6fc5c14c6f831f36aaf4f6736da31f67985da917)
@@ -379,4 +379,6 @@
 				// don't make a function whose parameter is an unnamed bitfield
 				continue;
+			} else if ( ! InitTweak::isConstructable( field->get_type() ) ) {
+				continue;
 			}
 			memCtorType->parameters.push_back( new ObjectDecl( field->name, Type::StorageClasses(), LinkageSpec::Cforall, 0, field->get_type()->clone(), 0 ) );
@@ -407,6 +409,9 @@
 				}
 
-				if ( type->get_const() && func->get_name() == "?=?" ) {
+				if ( type->get_const() && CodeGen::isAssignment( func->name ) ) {
 					// don't assign const members, but do construct/destruct
+					continue;
+				} else if ( CodeGen::isCtorDtor( func->name ) && ! InitTweak::isConstructable( type ) ) {
+					// don't construct non-constructable types
 					continue;
 				}
@@ -441,4 +446,7 @@
 				if ( isUnnamedBitfield( dynamic_cast< ObjectDecl * > ( field ) ) ) {
 					// don't make a function whose parameter is an unnamed bitfield
+					continue;
+				} else if ( ! InitTweak::isConstructable( field->get_type() ) ) {
+					// don't construct non-constructable types
 					continue;
 				} else if ( parameter != params.end() ) {
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 447c35601995880f86baa595fb0755c65564b620)
+++ src/SymTab/Indexer.cc	(revision 6fc5c14c6f831f36aaf4f6736da31f67985da917)
@@ -407,7 +407,7 @@
 		makeWritable();
 
-		const std::string &name = decl->get_name();
+		const std::string &name = decl->name;
 		std::string mangleName;
-		if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) {
+		if ( LinkageSpec::isOverridable( decl->linkage ) ) {
 			// mangle the name without including the appropriate suffix, so overridable routines are placed into the
 			// same "bucket" as their user defined versions.
@@ -418,5 +418,5 @@
 
 		// this ensures that no two declarations with the same unmangled name at the same scope both have C linkage
-		if ( ! LinkageSpec::isMangled( decl->get_linkage() ) ) {
+		if ( ! LinkageSpec::isMangled( decl->linkage ) ) {
 			// NOTE this is broken in Richard's original code in such a way that it never triggers (it
 			// doesn't check decls that have the same manglename, and all C-linkage decls are defined to
