Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision 80eefcbc5f9cf0e96b03174100a2ac5bb28ee6ac)
+++ src/ResolvExpr/CurrentObject.cc	(revision 99614c25485a445fe8b29250bef7718bb7bb7883)
@@ -65,6 +65,6 @@
 		virtual void setPosition( std::list< Expression * > & designators ) = 0;
 
-		/// retrieve the list of possible Type/Designaton pairs for the current position in the currect object
-		virtual std::list<InitAlternative> operator*() const = 0;
+		/// retrieve the vector of possible Type/Designaton pairs for the current position in the currect object
+		virtual std::vector<InitAlternative> operator*() const = 0;
 
 		/// true if the iterator is not currently at the end
@@ -88,5 +88,5 @@
 		/// helper for operator*; aggregates must add designator to each init alternative, but
 		/// adding designators in operator* creates duplicates.
-		virtual std::list<InitAlternative> first() const = 0; // should be protected
+		virtual std::vector<InitAlternative> first() const = 0; // should be protected
 	};
 
@@ -109,5 +109,5 @@
 		}
 
-		virtual std::list<InitAlternative> operator*() const { return first(); }
+		virtual std::vector<InitAlternative> operator*() const { return first(); }
 		virtual operator bool() const { return type; }
 
@@ -127,7 +127,7 @@
 
 	protected:
-		virtual std::list<InitAlternative> first() const {
-			if ( type ) return std::list<InitAlternative>{ { type->clone(), new Designation( {} ) } };
-			else return std::list<InitAlternative>{};
+		virtual std::vector<InitAlternative> first() const {
+			if ( type ) return std::vector<InitAlternative>{ { type->clone(), new Designation( {} ) } };
+			else return std::vector<InitAlternative>{};
 		}
 	private:
@@ -192,5 +192,5 @@
 		}
 
-		virtual std::list<InitAlternative> operator*() const {
+		virtual std::vector<InitAlternative> operator*() const {
 			return first();
 		}
@@ -223,8 +223,8 @@
 		virtual Type * getNext() { return base; }
 
-		virtual std::list<InitAlternative> first() const {
+		virtual std::vector<InitAlternative> first() const {
 			PRINT( std::cerr << "first in ArrayIterator (" << index << "/" << size << ")" << std::endl; )
 			if ( memberIter && *memberIter ) {
-				std::list<InitAlternative> ret = memberIter->first();
+				std::vector<InitAlternative> ret = memberIter->first();
 				for ( InitAlternative & alt : ret ) {
 					alt.designation->get_designators().push_front( new ConstantExpr( Constant::from_ulong( index ) ) );
@@ -232,5 +232,5 @@
 				return ret;
 			}
-			return std::list<InitAlternative>();
+			return std::vector<InitAlternative>();
 		}
 
@@ -288,7 +288,7 @@
 		}
 
-		virtual std::list<InitAlternative> operator*() const {
+		virtual std::vector<InitAlternative> operator*() const {
 			if (memberIter && *memberIter) {
-				std::list<InitAlternative> ret = memberIter->first();
+				std::vector<InitAlternative> ret = memberIter->first();
 				PRINT( std::cerr << "sub: " << sub << std::endl; )
 				for ( InitAlternative & alt : ret ) {
@@ -302,5 +302,5 @@
 				return ret;
 			}
-			return std::list<InitAlternative>();
+			return std::vector<InitAlternative>();
 		}
 
@@ -346,6 +346,6 @@
 		}
 
-		virtual std::list<InitAlternative> first() const {
-			std::list<InitAlternative> ret;
+		virtual std::vector<InitAlternative> first() const {
+			std::vector<InitAlternative> ret;
 			PRINT( std::cerr << "first " << kind << std::endl; )
 			if ( memberIter && *memberIter ) { // might not need *memberIter??
@@ -361,5 +361,5 @@
 				// only add self if at the very beginning of the structure
 				PRINT( std::cerr << "adding self" << std::endl; )
-				ret.push_front( { inst->clone(), new Designation( {} ) } );
+				ret.insert(ret.begin(), { inst->clone(), new Designation( {} ) } );
 			}
 			return ret;
@@ -566,5 +566,5 @@
 	}
 
-	std::list< InitAlternative > CurrentObject::getOptions() {
+	std::vector< InitAlternative > CurrentObject::getOptions() {
 		PRINT( std::cerr << "____getting current options" << std::endl; )
 		assertf( ! objStack.empty(), "objstack empty in getOptions" );
Index: src/ResolvExpr/CurrentObject.h
===================================================================
--- src/ResolvExpr/CurrentObject.h	(revision 80eefcbc5f9cf0e96b03174100a2ac5bb28ee6ac)
+++ src/ResolvExpr/CurrentObject.h	(revision 99614c25485a445fe8b29250bef7718bb7bb7883)
@@ -16,5 +16,5 @@
 #pragma once
 
-#include <list>   // for list
+#include <vector> // for vector
 #include <stack>  // for stack
 
@@ -43,5 +43,5 @@
 		void exitListInit();
 		/// produces a list of alternatives (Type *, Designation *) for the current sub-object's initializer
-		std::list< InitAlternative > getOptions();
+		std::vector< InitAlternative > getOptions();
 		/// produces the type of the current object but no subobjects
 		Type * getCurrentType();
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 80eefcbc5f9cf0e96b03174100a2ac5bb28ee6ac)
+++ src/ResolvExpr/Resolver.cc	(revision 99614c25485a445fe8b29250bef7718bb7bb7883)
@@ -513,5 +513,5 @@
 	void Resolver::previsit( CaseStmt *caseStmt ) {
 		if ( caseStmt->condition ) {
-			std::list< InitAlternative > initAlts = currentObject.getOptions();
+			const auto & initAlts = currentObject.getOptions();
 			assertf( initAlts.size() == 1, "SwitchStmt did not correctly resolve an integral expression." );
 			// must remove cast from case statement because RangeExpr cannot be cast.
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 80eefcbc5f9cf0e96b03174100a2ac5bb28ee6ac)
+++ src/SynTree/Expression.cc	(revision 99614c25485a445fe8b29250bef7718bb7bb7883)
@@ -698,5 +698,5 @@
 }
 
-UntypedInitExpr::UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ) : expr( expr ), initAlts( initAlts ) {}
+UntypedInitExpr::UntypedInitExpr( Expression * expr, const std::vector<InitAlternative> & initAlts ) : expr( expr ), initAlts( initAlts ) {}
 UntypedInitExpr::UntypedInitExpr( const UntypedInitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), initAlts( other.initAlts ) {}
 UntypedInitExpr::~UntypedInitExpr() {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 80eefcbc5f9cf0e96b03174100a2ac5bb28ee6ac)
+++ src/SynTree/Expression.h	(revision 99614c25485a445fe8b29250bef7718bb7bb7883)
@@ -62,5 +62,5 @@
 	InferredParams inferParams;       ///< Post-resolution inferred parameter slots
 	std::vector<UniqueId> resnSlots;  ///< Pre-resolution inferred parameter slots
-	
+
 	// xxx - should turn inferParams+resnSlots into a union to save some memory
 
@@ -813,7 +813,7 @@
 public:
 	Expression * expr;
-	std::list<InitAlternative> initAlts;
-
-	UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts );
+	std::vector<InitAlternative> initAlts;
+
+	UntypedInitExpr( Expression * expr, const std::vector<InitAlternative> & initAlts );
 	UntypedInitExpr( const UntypedInitExpr & other );
 	~UntypedInitExpr();
@@ -822,5 +822,5 @@
 	UntypedInitExpr * set_expr( Expression * newValue ) { expr = newValue; return this; }
 
-	std::list<InitAlternative> & get_initAlts() { return initAlts; }
+	std::vector<InitAlternative> & get_initAlts() { return initAlts; }
 
 	virtual UntypedInitExpr * clone() const { return new UntypedInitExpr( * this ); }
