Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 208e5be0ae49214c1fec10d2af38286ebc837ee8)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision a61ad31375e748db470d1432e85336461752723c)
@@ -305,4 +305,7 @@
 				std::cerr << std::endl << " to ";
 				formalType->print( std::cerr, 8 );
+				std::cerr << std::endl << "environment is: ";
+				alt.env.print( std::cerr, 8 );
+				std::cerr << std::endl;
 			)
 			Cost newCost = conversionCost( actualType, formalType, indexer, alt.env );
@@ -400,4 +403,5 @@
 			Expression * actual = actualIt->expr;
 			Type * actualType = actual->get_result();
+
 			PRINT(
 				std::cerr << "formal type is ";
@@ -643,4 +647,5 @@
 			makeExprList( instantiatedActuals, appExpr->get_args() );
 			PRINT(
+				std::cerr << "instantiate function success: " << appExpr << std::endl;
 				std::cerr << "need assertions:" << std::endl;
 				printAssertionSet( resultNeed, std::cerr, 8 );
@@ -753,5 +758,5 @@
 				PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() );
 				FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() );
-				std::cerr << "Case +++++++++++++" << std::endl;
+				std::cerr << "Case +++++++++++++ " << appExpr->get_function() << std::endl;
 				std::cerr << "formals are:" << std::endl;
 				printAll( function->get_parameters(), std::cerr, 8 );
@@ -796,5 +801,5 @@
 	bool isLvalue( Expression *expr ) {
 		// xxx - recurse into tuples?
-		return expr->has_result() && expr->get_result()->get_lvalue();
+		return expr->has_result() && ( expr->get_result()->get_lvalue() || dynamic_cast< ReferenceType * >( expr->get_result() ) );
 	}
 
@@ -882,10 +887,19 @@
 		funcFinder.findWithAdjustment( memberExpr->get_aggregate() );
 		for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) {
-			if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() ) ) {
-				addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
-			} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) {
-				addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
-			} else if ( TupleType * tupleType = dynamic_cast< TupleType * >( agg->expr->get_result() ) ) {
-				addTupleMembers( tupleType, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
+			// it's okay for the aggregate expression to have reference type -- cast it to the base type to treat the aggregate as the referenced value
+			std::unique_ptr<Expression> aggrExpr( agg->expr->clone() );
+			Type * aggrType = aggrExpr->get_result();
+			if ( dynamic_cast< ReferenceType * >( aggrType ) ) {
+				aggrType = aggrType->stripReferences();
+				aggrExpr.reset( new CastExpr( aggrExpr.release(), aggrType->clone() ) );
+			}
+
+			// find member of the given type
+			if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) {
+				addAggMembers( structInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
+			} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) {
+				addAggMembers( unionInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
+			} else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) {
+				addTupleMembers( tupleType, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
 			} // if
 		} // for
