Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/FixGlobalInit.cc	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,10 +10,10 @@
 // Created On       : Mon May 04 15:14:56 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon May 09 11:44:29 2016
+// Last Modified On : Fri May 13 11:37:30 2016
 // Update Count     : 2
 //
 
 #include "FixGlobalInit.h"
-#include "GenInit.h"
+#include "InitTweak.h"
 #include "SynTree/Declaration.h"
 #include "SynTree/Type.h"
@@ -125,7 +125,8 @@
 		std::list< Statement * > & destroyStatements = destroyFunction->get_statements()->get_kids();
 
-		if ( objDecl->get_init() == NULL ) return;
+		// if ( objDecl->get_init() == NULL ) return;
 		if ( ! tryConstruct( objDecl ) ) return; // don't construct @= or designated objects
 		if ( objDecl->get_type()->get_isConst() ) return; // temporary: can't assign to a const variable
+		if ( objDecl->get_storageClass() == DeclarationNode::Extern ) return;
 		// C allows you to initialize objects with constant expressions
 		// xxx - this is an optimization. Need to first resolve constructors before we decide
@@ -133,19 +134,23 @@
 		// if ( isConstExpr( objDecl->get_init() ) ) return;
 
-		// steal initializer from object and attach it to a new temporary
-		ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, objDecl->get_type()->clone(), objDecl->get_init() );
-		objDecl->set_init( NULL );
-		initStatements.push_back( new DeclStmt( noLabels, newObj ) );
+		if ( ArrayType * at = dynamic_cast< ArrayType * > ( objDecl->get_type() ) ) {
+			// xxx - initialize each element of the array
+		} else {
+			// steal initializer from object and attach it to a new temporary
+			ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, objDecl->get_type()->clone(), objDecl->get_init() );
+			objDecl->set_init( NULL );
+			initStatements.push_back( new DeclStmt( noLabels, newObj ) );
 
-		// copy construct objDecl using temporary
-		UntypedExpr * init = new UntypedExpr( new NameExpr( "?{}" ) );
-		init->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
-		init->get_args().push_back( new VariableExpr( newObj ) );
-		initStatements.push_back( new ExprStmt( noLabels, init ) );
+			// copy construct objDecl using temporary
+			UntypedExpr * init = new UntypedExpr( new NameExpr( "?{}" ) );
+			init->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
+			init->get_args().push_back( new VariableExpr( newObj ) );
+			initStatements.push_back( new ExprStmt( noLabels, init ) );
 
-		// add destructor calls to global destroy function
-		UntypedExpr * destroy = new UntypedExpr( new NameExpr( "^?{}" ) );
-		destroy->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
-		destroyStatements.push_front( new ExprStmt( noLabels, destroy ) );
+			// add destructor calls to global destroy function
+			UntypedExpr * destroy = new UntypedExpr( new NameExpr( "^?{}" ) );
+			destroy->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
+			destroyStatements.push_front( new ExprStmt( noLabels, destroy ) );
+		}
 	}
 
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/FixInit.cc	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon May 09 12:36:02 2016
+// Last Modified On : Fri May 13 11:44:26 2016
 // Update Count     : 30
 //
@@ -17,4 +17,5 @@
 #include <list>
 #include "FixInit.h"
+#include "InitTweak.h"
 #include "ResolvExpr/Resolver.h"
 #include "ResolvExpr/typeops.h"
@@ -27,5 +28,4 @@
 #include "SymTab/Indexer.h"
 #include "GenPoly/PolyMutator.h"
-#include "GenPoly/GenPoly.h"
 
 bool ctordtorp = false;
@@ -398,28 +398,4 @@
 	}
 
-	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>
@@ -428,5 +404,6 @@
 				// 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
+				// dtor then the call must (and will) still be generated since the argument
+				// may contain side effects.
 				if ( ! isInstrinsicSingleArgCallStmt( *it ) ) {
 					// don't need to call intrinsic dtor, because it does nothing, but
Index: src/InitTweak/FixInit.h
===================================================================
--- src/InitTweak/FixInit.h	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/FixInit.h	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon May 09 12:08:11 2016
+// Last Modified On : Fri May 13 11:27:52 2016
 // Update Count     : 5
 //
@@ -28,9 +28,4 @@
   /// 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/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/GenInit.cc	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri May 06 16:11:15 2016
+// Last Modified On : Fri May 13 11:37:48 2016
 // Update Count     : 166
 //
@@ -17,4 +17,5 @@
 #include <list>
 #include "GenInit.h"
+#include "InitTweak.h"
 #include "SynTree/Declaration.h"
 #include "SynTree/Type.h"
@@ -129,12 +130,5 @@
 	}
 
-	bool tryConstruct( ObjectDecl * objDecl ) {
-		// xxx - handle designations
-		return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) &&
- 			(objDecl->get_init() == NULL ||
-			( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() ));
-	}
 	namespace {
-
 		Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
 			UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );
@@ -142,31 +136,4 @@
 			expr->get_args().splice( expr->get_args().end(), args );
 			return expr;
-		}
-
-		class InitExpander : public Visitor {
-		  public:
-		  InitExpander() {}
-		  // ~InitExpander() {}
-			virtual void visit( SingleInit * singleInit );
-			virtual void visit( ListInit * listInit );
-			std::list< Expression * > argList;
-		};
-
-		void InitExpander::visit( SingleInit * singleInit ) {
-			argList.push_back( singleInit->get_value()->clone() );
-		}
-
-		void InitExpander::visit( ListInit * listInit ) {
-			// xxx - for now, assume no nested list inits
-			std::list<Initializer*>::iterator it = listInit->begin_initializers();
-			for ( ; it != listInit->end_initializers(); ++it ) {
-				(*it)->accept( *this );
-			}
-		}
-
-		std::list< Expression * > makeInitList( Initializer * init ) {
-			InitExpander expander;
-			maybeAccept( init, expander );
-			return expander.argList;
 		}
 	}
@@ -179,22 +146,33 @@
 					// 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
-					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() ) );
+					std::list< Expression * > args = makeInitList( objDecl->get_init() );
+					if ( args.empty() ) {
+						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 {
+						// array came with an initializer list: initialize each element
+						// may have more initializers than elements in the array - need to check at each index that
+						// we haven't exceeded size. This requires precomputing the size because it might be a side-effecting
+						// computation.
+						// may have fewer initializers than eleemnts in the array - need to default construct
+						// remaining elements.
+						// might be able to merge this with the case above.
+					}
 				} else {
 					// it's sufficient to attempt to call the ctor/dtor for the given object and its initializer
Index: src/InitTweak/GenInit.h
===================================================================
--- src/InitTweak/GenInit.h	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/GenInit.h	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri May 06 16:18:22 2016
+// Last Modified On : Fri May 13 11:27:19 2016
 // Update Count     : 3
 //
@@ -27,6 +27,4 @@
 	/// Adds return value temporaries and wraps Initializers in ConstructorInit nodes
 	void genInit( std::list< Declaration * > & translationUnit );
-	/// True if the resolver should try to construct objDecl
-	bool tryConstruct( ObjectDecl * objDecl );
 } // namespace
 
Index: src/InitTweak/module.mk
===================================================================
--- src/InitTweak/module.mk	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/InitTweak/module.mk	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -11,5 +11,5 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Rob Schluntz
-## Last Modified On : Fri May 06 15:59:27 2016
+## Last Modified On : Fri May 13 11:36:24 2016
 ## Update Count     : 3
 ###############################################################################
@@ -17,4 +17,5 @@
 SRC += InitTweak/GenInit.cc \
 	InitTweak/FixInit.cc \
-	InitTweak/FixGlobalInit.cc
+	InitTweak/FixGlobalInit.cc \
+	InitTweak/InitTweak.cc
 
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/Makefile.in	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -126,4 +126,5 @@
 	InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \
 	InitTweak/driver_cfa_cpp-FixGlobalInit.$(OBJEXT) \
+	InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT) \
 	Parser/driver_cfa_cpp-parser.$(OBJEXT) \
 	Parser/driver_cfa_cpp-lex.$(OBJEXT) \
@@ -350,9 +351,10 @@
 	GenPoly/DeclMutator.cc InitTweak/GenInit.cc \
 	InitTweak/FixInit.cc InitTweak/FixGlobalInit.cc \
-	Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
-	Parser/ParseNode.cc Parser/DeclarationNode.cc \
-	Parser/ExpressionNode.cc Parser/StatementNode.cc \
-	Parser/InitializerNode.cc Parser/TypeData.cc \
-	Parser/LinkageSpec.cc Parser/parseutility.cc Parser/Parser.cc \
+	InitTweak/InitTweak.cc Parser/parser.yy Parser/lex.ll \
+	Parser/TypedefTable.cc Parser/ParseNode.cc \
+	Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
+	Parser/StatementNode.cc Parser/InitializerNode.cc \
+	Parser/TypeData.cc Parser/LinkageSpec.cc \
+	Parser/parseutility.cc Parser/Parser.cc \
 	ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \
 	ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \
@@ -571,4 +573,6 @@
 	InitTweak/$(DEPDIR)/$(am__dirstamp)
 InitTweak/driver_cfa_cpp-FixGlobalInit.$(OBJEXT):  \
+	InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp)
+InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT):  \
 	InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp)
 Parser/parser.h: Parser/parser.cc
@@ -806,4 +810,5 @@
 	-rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT)
 	-rm -f InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT)
+	-rm -f InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT)
 	-rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT)
 	-rm -f Parser/driver_cfa_cpp-ExpressionNode.$(OBJEXT)
@@ -914,4 +919,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-DeclarationNode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-ExpressionNode.Po@am__quote@
@@ -1425,4 +1431,18 @@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-FixGlobalInit.obj `if test -f 'InitTweak/FixGlobalInit.cc'; then $(CYGPATH_W) 'InitTweak/FixGlobalInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixGlobalInit.cc'; fi`
 
+InitTweak/driver_cfa_cpp-InitTweak.o: InitTweak/InitTweak.cc
+@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-InitTweak.o -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Tpo -c -o InitTweak/driver_cfa_cpp-InitTweak.o `test -f 'InitTweak/InitTweak.cc' || echo '$(srcdir)/'`InitTweak/InitTweak.cc
+@am__fastdepCXX_TRUE@	$(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='InitTweak/InitTweak.cc' object='InitTweak/driver_cfa_cpp-InitTweak.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-InitTweak.o `test -f 'InitTweak/InitTweak.cc' || echo '$(srcdir)/'`InitTweak/InitTweak.cc
+
+InitTweak/driver_cfa_cpp-InitTweak.obj: InitTweak/InitTweak.cc
+@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-InitTweak.obj -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Tpo -c -o InitTweak/driver_cfa_cpp-InitTweak.obj `if test -f 'InitTweak/InitTweak.cc'; then $(CYGPATH_W) 'InitTweak/InitTweak.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/InitTweak.cc'; fi`
+@am__fastdepCXX_TRUE@	$(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-InitTweak.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='InitTweak/InitTweak.cc' object='InitTweak/driver_cfa_cpp-InitTweak.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-InitTweak.obj `if test -f 'InitTweak/InitTweak.cc'; then $(CYGPATH_W) 'InitTweak/InitTweak.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/InitTweak.cc'; fi`
+
 Parser/driver_cfa_cpp-parser.o: Parser/parser.cc
 @am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parser.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parser.Tpo -c -o Parser/driver_cfa_cpp-parser.o `test -f 'Parser/parser.cc' || echo '$(srcdir)/'`Parser/parser.cc
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision fb24492e00fbd7d87707069b8f786859f049c418)
+++ src/ResolvExpr/Resolver.cc	(revision 7b3f66b14854533532aad4d0484874f36d0fa385)
@@ -10,5 +10,5 @@
 // Created On       : Sun May 17 12:17:01 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon May 09 12:10:19 2016
+// Last Modified On : Fri May 13 11:36:40 2016
 // Update Count     : 203
 //
@@ -25,5 +25,5 @@
 #include "SymTab/Indexer.h"
 #include "Common/utility.h"
-#include "InitTweak/FixInit.h"
+#include "InitTweak/InitTweak.h"
 
 #include <iostream>
