Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision 9e2c1f036fddf8f841b5d1d1b225d3cb03a7ca67)
+++ src/InitTweak/FixGlobalInit.cc	(revision ec798473c329cfa11338fd56ced73a7381697432)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 04 15:14:56 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri May 06 16:14:13 2016
+// Last Modified On : Mon May 09 11:44:29 2016
 // Update Count     : 2
 //
@@ -92,6 +92,15 @@
 		GlobalFixer fixer( name, inLibrary );
 		acceptAll( translationUnit, fixer );
-		translationUnit.push_back( fixer.initFunction );
-		translationUnit.push_back( fixer.destroyFunction );
+		// don't need to include function if it's empty
+		if ( fixer.initFunction->get_statements()->get_kids().empty() ) {
+			delete fixer.initFunction;
+		} else {
+			translationUnit.push_back( fixer.initFunction );
+		}
+		if ( fixer.destroyFunction->get_statements()->get_kids().empty() ) {
+			delete fixer.destroyFunction;
+		} else {
+			translationUnit.push_back( fixer.destroyFunction );
+		}
 	}
 
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 9e2c1f036fddf8f841b5d1d1b225d3cb03a7ca67)
+++ src/InitTweak/FixInit.cc	(revision ec798473c329cfa11338fd56ced73a7381697432)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed May 04 14:51:33 2016
+// Last Modified On : Mon May 09 12:36:02 2016
 // Update Count     : 30
 //
@@ -398,31 +398,43 @@
 	}
 
-	template<typename Iterator, typename OutputIterator>
-	void insertDtors( Iterator begin, Iterator end, OutputIterator out ) {
-		for ( Iterator it = begin ; it != end ; ++it ) {
-			// remove if instrinsic destructor statement. Note that this is only called
-			// on lists of implicit dtors, so if the user manually calls an intrinsic
-			// dtor then the call will still be generated
-			if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( *it ) ) {
-				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 need to call intrinsic dtor, because it does nothing
-				} else {
+	bool isInstrinsicSingleArgCallStmt( Statement * stmt ) {
+		if ( stmt == NULL ) return false;
+		if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( stmt ) ) {
+			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 ctor/dtors because autogenerated ctor/dtor
+			// will call all member dtors, and some members may have a user defined dtor.
+			FunctionType * funcType = GenPoly::getFunctionType( function->get_var()->get_type() );
+			assert( funcType );
+			return function->get_var()->get_linkage() == LinkageSpec::Intrinsic && funcType->get_parameters().size() == 1;
+		} else if ( CompoundStmt * compoundStmt = dynamic_cast< CompoundStmt * >( stmt ) ) {
+			// could also be a compound statement with a loop, in the case of an array
+			assert( compoundStmt->get_kids().size() == 2 ); // loop variable and loop
+			ForStmt * forStmt = dynamic_cast< ForStmt * >( compoundStmt->get_kids().back() );
+			assert( forStmt && forStmt->get_body() );
+			return isInstrinsicSingleArgCallStmt( forStmt->get_body() );
+		} else {
+			// should never get here
+			assert( false && "encountered unknown call statement" );
+		}
+	}
+
+	namespace {
+		template<typename Iterator, typename OutputIterator>
+		void insertDtors( Iterator begin, Iterator end, OutputIterator out ) {
+			for ( Iterator it = begin ; it != end ; ++it ) {
+				// remove if instrinsic destructor statement. Note that this is only called
+				// on lists of implicit dtors, so if the user manually calls an intrinsic
+				// dtor then the call will still be generated
+				if ( ! isInstrinsicSingleArgCallStmt( *it ) ) {
+					// don't need to call intrinsic dtor, because it does nothing, but
 					// non-intrinsic dtors must be called
 					*out++ = (*it)->clone();
 				}
-			} else {
-				// could also be a compound statement with a loop, in the case of an array
-				// xxx - write code to remove loop calling intrinsic dtor.
-				*out++ = (*it)->clone();
 			}
 		}
 	}
-
 
 	CompoundStmt * FixInit::mutate( CompoundStmt * compoundStmt ) {
Index: src/InitTweak/FixInit.h
===================================================================
--- src/InitTweak/FixInit.h	(revision 9e2c1f036fddf8f841b5d1d1b225d3cb03a7ca67)
+++ src/InitTweak/FixInit.h	(revision ec798473c329cfa11338fd56ced73a7381697432)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jan 13 16:31:13 2016
+// Last Modified On : Mon May 09 12:08:11 2016
 // Update Count     : 5
 //
@@ -28,4 +28,9 @@
   /// and unwrap basic C-style initializers
 	void fix( std::list< Declaration * > & translationUnit );
+
+  /// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
+  /// Intended to be used for default ctor/dtor calls, but might have use elsewhere.
+  /// Currently has assertions that make it less than fully general.
+  bool isInstrinsicSingleArgCallStmt( Statement * expr );
 } // namespace
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 9e2c1f036fddf8f841b5d1d1b225d3cb03a7ca67)
+++ src/ResolvExpr/Resolver.cc	(revision ec798473c329cfa11338fd56ced73a7381697432)
@@ -10,5 +10,5 @@
 // Created On       : Sun May 17 12:17:01 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 16:08:21 2016
+// Last Modified On : Mon May 09 12:10:19 2016
 // Update Count     : 203
 //
@@ -25,4 +25,5 @@
 #include "SymTab/Indexer.h"
 #include "Common/utility.h"
+#include "InitTweak/FixInit.h"
 
 #include <iostream>
@@ -499,4 +500,16 @@
 		delete ctorInit->get_init();
 		ctorInit->set_init( NULL );
+
+		// intrinsic single parameter constructors and destructors do nothing. Since this was
+		// implicitly generated, there's no way for it to have side effects, so get rid of it
+		// to clean up generated code.
+		if ( InitTweak::isInstrinsicSingleArgCallStmt( ctorInit->get_ctor() ) ) {
+			delete ctorInit->get_ctor();
+			ctorInit->set_ctor( NULL );
+		}
+		if ( InitTweak::isInstrinsicSingleArgCallStmt( ctorInit->get_ctor() ) ) {
+			delete ctorInit->get_dtor();
+			ctorInit->set_dtor( NULL );
+		}
 	}
 } // namespace ResolvExpr
