Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/CodeGen/CodeGenerator.cc	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Feb 09 13:24:40 2016
+// Last Modified On : Wed Mar 30 14:39:30 2016
 // Update Count     : 255
 //
@@ -282,5 +282,5 @@
 				  case OT_DTOR:
 				  // intrinsic destructors do nothing - don't generate any code
-				  output << " // " << dynamic_cast<VariableExpr*>(applicationExpr->get_function())->get_var()->get_name() << endl;
+				  output << " /* " << dynamic_cast<VariableExpr*>(applicationExpr->get_function())->get_var()->get_name() << " */";
 				  break;
 
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/InitTweak/FixInit.cc	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Jan 19 16:36:59 2016
+// Last Modified On : Wed Mar 30 14:34:46 2016
 // Update Count     : 30
 //
@@ -37,4 +37,7 @@
 
 		virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
+
+	  private:
+		std::list< Statement * > dtorStmts;
 	};
 
@@ -52,9 +55,10 @@
 			// a decision should have been made by the resolver, so ctor and init are not both non-NULL
 			assert( ! ctorInit->get_ctor() || ! ctorInit->get_init() );
-			if ( Expression * ctor = ctorInit->get_ctor() ) {
-				ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor );
-				stmtsToAddAfter.push_back( ctorStmt );
+			if ( Statement * ctor = ctorInit->get_ctor() ) {
+				stmtsToAddAfter.push_back( ctor );
+				dtorStmts.push_front( ctorInit->get_dtor() );
 				objDecl->set_init( NULL );
 				ctorInit->set_ctor( NULL );
+				ctorInit->set_dtor( NULL );  // xxx - only destruct when constructing? Probably not?
 			} else if ( Initializer * init = ctorInit->get_init() ) {
 				objDecl->set_init( init );
@@ -70,25 +74,38 @@
 
 	CompoundStmt * FixInit::mutate( CompoundStmt * compoundStmt ) {
+		// mutate statements - this will also populate dtorStmts list
+		// don't want to dump all destructors when block is left,
+		// just the destructors associated with variables defined in this block
+		std::list< Statement * > oldDestructorStmts = dtorStmts;
+		dtorStmts = std::list<Statement *>();
+
+		compoundStmt = PolyMutator::mutate( compoundStmt );
 		std::list< Statement * > & statements = compoundStmt->get_kids();
-		for ( std::list< Statement * >::iterator it = statements.begin(); it != statements.end(); ) {
+		for ( std::list< Statement * >::iterator it = dtorStmts.begin(); it != dtorStmts.end(); ++it ) {
 			// remove if instrinsic destructor statement
 			// xxx - test user manually calling intrinsic functions - what happens?
 			if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( *it ) ) {
-				if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( exprStmt->get_expr() ) ) {
-					if ( VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ) ) {
-						// check for Intrinsic only - don't want to remove all overridable dtors because autogenerated dtor
-						// will call all member dtors, and some members may have a user defined dtor.
-						if ( function->get_var()->get_name() == "^?{}" && function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
-							statements.erase(it++);
-							continue;
-						} else {
-						}
-					}
+				ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( exprStmt->get_expr() );
+				assert( appExpr );
+				VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() );
+				assert( function );
+				// check for Intrinsic only - don't want to remove all overridable dtors because autogenerated dtor
+				// will call all member dtors, and some members may have a user defined dtor.
+				if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
+					// don't ned to call intrinsic dtor, because it does nothing
+					delete *it;
+				} else {
+					// non-intrinsic dtors must be called
+					statements.push_back( *it );
 				}
+			} else {
+				// could also be a compound statement with a loop, in the case of an array
+				statements.push_back( *it );
 			}
-			++it;
 		}
-		// mutate non-destructor statements
-		return PolyMutator::mutate( compoundStmt );
+		// TODO: adding to the end of a block isn't sufficient, since
+		// return/break/goto should trigger destructor when block is left.
+		dtorStmts = oldDestructorStmts;
+		return compoundStmt;
 	}
 
Index: src/InitTweak/RemoveInit.cc
===================================================================
--- src/InitTweak/RemoveInit.cc	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/InitTweak/RemoveInit.cc	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Feb 09 15:12:29 2016
+// Last Modified On : Wed Mar 30 15:45:12 2016
 // Update Count     : 166
 //
@@ -72,11 +72,6 @@
 		virtual Declaration* mutate( TypedefDecl *typeDecl );
 
-		virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
-
 	  protected:
 		bool inFunction;
-
-		// to be added before block ends - use push_front so order is correct
-		std::list< Statement * > destructorStmts;
 	};
 
@@ -199,6 +194,22 @@
 					// call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array
 					// TODO: walk initializer and generate appropriate copy ctor if element has initializer
-					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( stmtsToAddAfter ) );
-					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( destructorStmts ), false );
+					std::list< Statement * > ctor;
+					std::list< Statement * > dtor;
+
+					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( ctor ) );
+					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( dtor ), false );
+
+					// Currently makeArrayFunction produces a single Statement - a CompoundStmt
+					// which  wraps everything that needs to happen. As such, it's technically
+					// possible to use a Statement ** in the above calls, but this is inherently
+					// unsafe, so instead we take the slightly less efficient route, but will be
+					// immediately informed if somehow the above assumption is broken. In this case,
+					// we could always wrap the list of statements at this point with a CompoundStmt,
+					// but it seems reasonable at the moment for this to be done by makeArrayFunction
+					// itself
+					assert( ctor.size() == 1 );
+					assert( dtor.size() == 1 );
+
+					objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );
 				} else {
 					// it's sufficient to attempt to call the ctor/dtor for the given object and its initializer
@@ -209,6 +220,7 @@
 					// if ctor does exist, want to use ctor expression instead of init
 					// push this decision to the resolver
-					objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) );
-					destructorStmts.push_front( new ExprStmt( noLabels, dtor ) );
+					ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor );
+					ExprStmt * dtorStmt = new ExprStmt( noLabels, dtor );
+					objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init() ) );
 				}
 			} else {
@@ -234,22 +246,4 @@
 	}
 
-	CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
-		// don't want to dump all destructors when block is left,
-		// just the destructors associated with variables defined in this block
-		std::list< Statement * > oldDestructorStmts = destructorStmts;
-		destructorStmts = std::list<Statement *>();
-
-		CompoundStmt * ret = PolyMutator::mutate( compoundStmt );
-		std::list< Statement * > &statements = ret->get_kids();
-		if ( ! destructorStmts.empty() ) {
-			// TODO: adding to the end of a block isn't sufficient, since
-			// return/break/goto should trigger destructor when block is left.
-			statements.splice( statements.end(), destructorStmts );
-		} // if
-
-		destructorStmts = oldDestructorStmts;
-		return ret;
-	}
-
 	// should not traverse into any of these declarations to find objects
 	// that need to be constructed or destructed
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/ResolvExpr/Resolver.cc	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Sun May 17 12:17:01 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Jan 14 16:45:32 2016
+// Last Modified On : Wed Mar 30 15:47:19 2016
 // Update Count     : 203
 //
@@ -478,7 +478,7 @@
 	void Resolver::visit( ConstructorInit *ctorInit ) {
 		TypeEnvironment env;
-		AlternativeFinder finder( *this, env );
 		try {
-			finder.find( ctorInit->get_ctor() );
+			maybeAccept( ctorInit->get_ctor(), *this );
+			maybeAccept( ctorInit->get_dtor(), *this );
 		} catch ( SemanticError ) {
 			// no alternatives for the constructor initializer - fallback on C-style initializer
@@ -488,28 +488,19 @@
 		}
 
-		assert( ! finder.get_alternatives().empty() );
-
-		if ( finder.get_alternatives().size() == 1 ) {
-			Alternative &choice = finder.get_alternatives().front();
-			if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) {
-				if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) {
-					if ( LinkageSpec::isOverridable( function->get_var()->get_linkage() ) ) {
-						// if the constructor that was found is intrinsic or autogenerated, reset to C-style
-						// initializer so that code generation is easy to handle
-						fallbackInit( ctorInit );
-						return;
-					}
-				}
+		if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * > ( ctorInit->get_ctor() ) ) {
+			ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( exprStmt->get_expr() );
+			assert( appExpr );
+			VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() );
+			assert( function );
+			if ( LinkageSpec::isOverridable( function->get_var()->get_linkage() ) ) {
+				// if the constructor that was found is intrinsic or autogenerated, reset to C-style
+				// initializer so that code generation is easy to handle
+				fallbackInit( ctorInit );
+				return;
 			}
-			// found a constructor - can get rid of C-style initializer
-			Expression *newExpr = choice.expr->clone();
-			finishExpr( newExpr, choice.env );
-			ctorInit->set_ctor( newExpr );
-			delete ctorInit->get_init();
-			ctorInit->set_init( NULL );
-		} else {
-			// too many constructors found
-			assert(false);
-		}
+		}
+		// found a constructor - can get rid of C-style initializer
+		delete ctorInit->get_init();
+		ctorInit->set_init( NULL );
 	}
 } // namespace ResolvExpr
Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/SynTree/Initializer.cc	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jan 13 15:31:45 2016
+// Last Modified On : Wed Mar 30 13:58:32 2016
 // Update Count     : 28
 //
@@ -16,4 +16,5 @@
 #include "Initializer.h"
 #include "Expression.h"
+#include "Statement.h"
 #include "Common/utility.h"
 
@@ -81,5 +82,5 @@
 
 
-ConstructorInit::ConstructorInit( Expression * ctor, Initializer * init ) : Initializer( true ), ctor( ctor ), init( init ) {}
+ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {}
 ConstructorInit::~ConstructorInit() {
 	delete ctor;
@@ -98,4 +99,9 @@
 	} // if
 
+	if ( dtor ) {
+		os << " destructed with ";
+		dtor->print( os, indent+2 );
+	}
+
 	if ( init ) {
 		os << " with fallback C-style initializer: ";
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/SynTree/Initializer.h	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Feb 09 14:40:15 2016
+// Last Modified On : Wed Mar 30 13:22:08 2016
 // Update Count     : 19
 //
@@ -107,9 +107,11 @@
 class ConstructorInit : public Initializer {
   public:
-	ConstructorInit( Expression * ctor, Initializer * init );
+	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init );
 	virtual ~ConstructorInit();
 
-	void set_ctor( Expression * newValue ) { ctor = newValue; }
-	Expression * get_ctor() const { return ctor; }
+	void set_ctor( Statement * newValue ) { ctor = newValue; }
+	Statement * get_ctor() const { return ctor; }
+	void set_dtor( Statement * newValue ) { dtor = newValue; }
+	Statement * get_dtor() const { return dtor; }
 	void set_init( Initializer * newValue ) { init = newValue; }
 	Initializer * get_init() const { return init; }
@@ -121,5 +123,6 @@
 
   private:
-	Expression * ctor;
+	Statement * ctor;
+	Statement * dtor;
 	// C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
 	// if an appropriate constructor definition is not found by the resolver
Index: src/libcfa/Makefile.am
===================================================================
--- src/libcfa/Makefile.am	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/libcfa/Makefile.am	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -60,5 +60,5 @@
 	${CC} ${CFLAGS} -c -o $@ $<
 
-libs = # stdlib iostream fstream iterator  # temporarily getting rid of these until ctor/dtor autogen works
+libs = stdlib iostream fstream iterator
 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
 
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision 4cc428651c83d14e03e03eefcb10aece78034e35)
+++ src/libcfa/Makefile.in	(revision 5b2f5bb4b0269a726d7840b6f270858c3ff12d9a)
@@ -83,5 +83,6 @@
 libcfa_a_AR = $(AR) $(ARFLAGS)
 libcfa_a_LIBADD =
-am__objects_1 =
+am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \
+	iterator.$(OBJEXT)
 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1)
 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
@@ -212,5 +213,5 @@
 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \
 	${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/*
-libs = # stdlib iostream fstream iterator  # temporarily getting rid of these until ctor/dtor autogen works
+libs = stdlib iostream fstream iterator
 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
 cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math
@@ -292,5 +293,9 @@
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iostream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@
 
 .c.obj:
