Index: doc/proposals/flags.md
===================================================================
--- doc/proposals/flags.md	(revision bf8da6606c2fc3df924eb158f0fd5cc39f7be465)
+++ doc/proposals/flags.md	(revision 17df48e3e83500db3b8c0c3abb50f353097405dd)
@@ -69,4 +69,29 @@
 In each of the cases above, `FOO` could be replaced by `(BAR | BAZ)` to do the same operation or test on multiple flags at once.
 
+### Alternative/Additional Features ###
+
+#### User-defined enum discriminant iterator ####
+It may be useful to provide a more general method for changing the enum discriminant assignment function, e.g. the flag enum discriminants could be defined by something like the following:
+
+	```
+	enum(@ << 1) TCP_Flags {  // each discriminant is left-shifted by 1 from the previous
+		FIN = 0x1,  // first flag is 1
+		SYN,
+		ACK,
+		...
+	}
+	```
+
+#### Member expression for enums ####
+As a more ergonomic way to set and unset enum flags, we could define a member expression for flags enums. Since only unions and structs can have member expressions now, this change would be backwards compatible. Basically, given a `FunFlags f`, `f.FOO` would return a proxy object which could be implicitly converted to `bool` (with semantics `f & FOO`, i.e. "check if `FOO` is set on `f`"), as well as having `bool` assigned to it (with semantics `f |= FOO` on true or `f -= FOO` on false, i.e. "set or unset `FOO` on `f` as appropriate"). With this member function, the operations above can be expressed as follows (possibly more ergonomically):
+
+	```
+	FunFlags f = some_val();
+	if ( f.FOO ) { sout | "f has FOO set" | endl; }
+	f.FOO = true;    // set FOO
+	f.FOO = false;   // unset FOO
+	f.FOO = ! f.FOO; // toggle FOO
+	```
+
 ### Related Work ###
 C# has the [`[Flags]`][1] enum attribute, but their proposal does not go as far; specifically, the flag discriminants must be manually specified, and they do not automatically implement the bitwise operators on the flags. 
