Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 30aeb27024b481c431df7c2de351ebfb5e2348e5)
+++ src/GenPoly/Box.cc	(revision 43181074867ab6b19a3a764f8f4989f623670408)
@@ -1407,4 +1407,5 @@
 			if ( ! objectType ) return memberExpr;
 
+			Expression *newMemberExpr = 0;
 			if ( StructInstType *structType = dynamic_cast< StructInstType* >( objectType ) ) {
 				// look up offset index
@@ -1416,13 +1417,21 @@
 				fieldLoc->get_args().push_back( makeDerefdVar( varExpr->clone(), varDepth ) );
 				fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
-
-				delete memberExpr;
-				return fieldLoc;
+				newMemberExpr = fieldLoc;
 			} else if ( dynamic_cast< UnionInstType* >( objectType ) ) {
 				// union members are all at offset zero, so build appropriately-dereferenced variable
-				Expression *derefdVar = makeDerefdVar( varExpr->clone(), varDepth );
-				delete memberExpr;
-				return derefdVar;
+				newMemberExpr = makeDerefdVar( varExpr->clone(), varDepth );
 			} else return memberExpr;
+			assert( newMemberExpr );
+
+			// wrap pointer members in appropriate cast
+			if ( dynamic_cast< PointerType* >( memberExpr->get_member()->get_type() ) ) {
+				CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ) ) );
+				UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
+				derefExpr->get_args().push_back( ptrCastExpr );
+				newMemberExpr = derefExpr;
+			}
+
+			delete memberExpr;
+			return newMemberExpr;
 		}
 
