Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision dc124819c235617d272c2eee265317c408956362)
+++ src/GenPoly/Box.cc	(revision 90c3b1c9b36943edd6040aac93c3da9265b218a4)
@@ -1448,7 +1448,8 @@
 			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() ) ) ) );
+			Type *memberType = memberExpr->get_member()->get_type();
+			if ( ! isPolyType( memberType, scopeTyVars ) ) {
+				// Not all members of a polymorphic type are themselves of polymorphic type; in this case the member expression should be wrapped and dereferenced to form an lvalue
+				CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), memberType->clone() ) );
 				UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
 				derefExpr->get_args().push_back( ptrCastExpr );
