Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 33a7b6db7e7a3b3fa85ef51cb227fdc43223b1fd)
+++ src/SynTree/Expression.cc	(revision 186fd864a423a60033d1f353374a4070a3294b18)
@@ -332,8 +332,24 @@
 }
 
+namespace {
+	TypeSubstitution makeSub( Type * t ) {
+		if ( StructInstType * aggInst = dynamic_cast< StructInstType * >( t ) ) {
+			return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() );
+		} else if ( UnionInstType * aggInst = dynamic_cast< UnionInstType * >( t ) ) {
+			return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() );
+		} else {
+			assertf( false, "makeSub expects struct or union type for aggregate" );
+		}
+	}
+}
+
 
 MemberExpr::MemberExpr( DeclarationWithType *_member, Expression *_aggregate, Expression *_aname ) :
 		Expression( _aname ), member(_member), aggregate(_aggregate) {
-	set_result( member->get_type()->clone() );
+
+	TypeSubstitution sub( makeSub( aggregate->get_result() ) );
+	Type * res = member->get_type()->clone();
+	sub.apply( res );
+	set_result( res );
 	get_result()->set_isLvalue( true );
 }
