Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 066d77aa36581ca93f86102e251986a4932570ab)
+++ src/GenPoly/Lvalue.cc	(revision b6fd7517dcd49accffbb4e92357f4fec8890b879)
@@ -55,4 +55,13 @@
 		  private:
 		};
+
+		/// GCC-like Generalized Lvalues (which have since been removed from GCC)
+		/// https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Lvalues.html#Lvalues
+		/// Replaces &(a,b) with (a, &b), &(a ? b : c) with (a ? &b : &c)
+		class GeneralizedLvalue : public Mutator {
+			typedef Mutator Parent;
+
+			virtual Expression * mutate( AddressExpr * addressExpr );
+		};
 	} // namespace
 
@@ -60,6 +69,8 @@
 		Pass1 p1;
 		Pass2 p2;
+		GeneralizedLvalue genLval;
 		mutateAll( translationUnit, p1 );
 		acceptAll( translationUnit, p2 );
+		mutateAll( translationUnit, genLval );
 	}
 
@@ -153,4 +164,21 @@
 			Visitor::visit( funType );
 		}
+
+		Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) {
+			addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) );
+			if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( addrExpr->get_arg() ) ) {
+				Expression * arg1 = commaExpr->get_arg1()->clone();
+				Expression * arg2 = commaExpr->get_arg2()->clone();
+				delete addrExpr;
+				return new CommaExpr( arg1, new AddressExpr( arg2 ) );
+			} else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( addrExpr->get_arg() ) ) {
+				Expression * arg1 = condExpr->get_arg1()->clone();
+				Expression * arg2 = condExpr->get_arg2()->clone();
+				Expression * arg3 = condExpr->get_arg3()->clone();
+				delete addrExpr;
+				return new ConditionalExpr( arg1, new AddressExpr( arg2 ), new AddressExpr( arg3 ) );
+			}
+			return addrExpr;
+		}
 	} // namespace
 } // namespace GenPoly
