Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 9bfc9da8135feec0d8796caf32105cd2b1957afc)
+++ src/GenPoly/Box.cc	(revision 02c816fc4190a7dead3432560cc29586f44826a4)
@@ -163,4 +163,6 @@
 			void premutate( DeclStmt *declStmt );
 			Expression *postmutate( MemberExpr *memberExpr );
+			void premutate( AddressExpr *addrExpr );
+			Expression *postmutate( AddressExpr *addrExpr );
 			Expression *postmutate( SizeofExpr *sizeofExpr );
 			Expression *postmutate( AlignofExpr *alignofExpr );
@@ -193,4 +195,5 @@
 			ScopedSet< std::string > knownOffsets;          ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName
 			UniqueName bufNamer;                           ///< Namer for VLA buffers
+			Expression * addrMember = nullptr;             ///< AddressExpr argument is MemberExpr?
 		};
 
@@ -1596,4 +1599,28 @@
 		}
 
+		void PolyGenericCalculator::premutate( AddressExpr * addrExpr ) {
+			GuardValue( addrMember );
+			// is the argument a MemberExpr before mutating?
+			addrMember = dynamic_cast< MemberExpr * >( addrExpr->arg );
+		}
+
+		Expression * PolyGenericCalculator::postmutate( AddressExpr * addrExpr ) {
+			if ( addrMember && addrMember != addrExpr->arg ) {
+				// arg was a MemberExpr and has been mutated
+				if ( UntypedExpr * untyped = dynamic_cast< UntypedExpr * >( addrExpr->arg ) ) {
+					if ( InitTweak::getFunctionName( untyped ) == "?+?" ) {
+						// MemberExpr was converted to pointer+offset, and it is not valid C to take the address of an addition, so strip the address-of
+						// TODO: should  addrExpr->arg->result be changed to addrExpr->result?
+						Expression * ret = addrExpr->arg;
+						addrExpr->arg = nullptr;
+						std::swap( addrExpr->env, ret->env );
+						delete addrExpr;
+						return ret;
+					}
+				}
+			}
+			return addrExpr;
+		}
+
 		ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
 			ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, nullptr, type, init );
