Index: libcfa/prelude/builtins.c
===================================================================
--- libcfa/prelude/builtins.c	(revision fd0a1799edd605d4d425f453cbf773d11bb8d520)
+++ libcfa/prelude/builtins.c	(revision 8e4f34e335930cfb7ffa7e01dbe76b95b6b64f61)
@@ -76,4 +76,17 @@
 }
 
+// Nearly "otype," except no parameterless constructor.
+// All you need, to store values in variables and to pass and return by value.
+// Many cases of
+//     forall( T ...
+// can be "simplified" to
+//     forall( T& | is_value(T) ...
+forall( T* )
+trait is_value {
+	void ?{}( T&, T );
+	T ?=?( T&, T );
+	void ^?{}( T& );
+};
+
 // implicit increment, decrement if += defined, and implicit not if != defined
 
@@ -81,17 +94,17 @@
 // assignment, but is not an lvalue." Hence, return a value not a reference.
 static inline {
-	forall( T | { T ?+=?( T &, one_t ); } )
+	forall( T& | is_value(T) | { T ?+=?( T &, one_t ); } )
 	T ++?( T & x ) { return x += 1; }
 
-	forall( T | { T ?+=?( T &, one_t ); } )
+	forall( T& | is_value(T) | { T ?+=?( T &, one_t ); } )
 	T ?++( T & x ) { T tmp = x; x += 1; return tmp; }
 
-	forall( T | { T ?-=?( T &, one_t ); } )
+	forall( T& | is_value(T) | { T ?-=?( T &, one_t ); } )
 	T --?( T & x ) { return x -= 1; }
 
-	forall( T | { T ?-=?( T &, one_t ); } )
+	forall( T& | is_value(T) | { T ?-=?( T &, one_t ); } )
 	T ?--( T & x ) { T tmp = x; x -= 1; return tmp; }
 
-	forall( T | { int ?!=?( T, zero_t ); } )
+	forall( T& | is_value(T) | { int ?!=?( T, zero_t ); } )
 	int !?( T & x ) { return !( x != 0 ); }
 } // distribution
Index: tests/zero_one.cfa
===================================================================
--- tests/zero_one.cfa	(revision fd0a1799edd605d4d425f453cbf773d11bb8d520)
+++ tests/zero_one.cfa	(revision 8e4f34e335930cfb7ffa7e01dbe76b95b6b64f61)
@@ -30,5 +30,4 @@
 S ?+=?( S & s, one_t ) { s.[i,j] += 1; return s; } // increment
 S ?-=?( S & s, one_t ) { s.[i,j] -= 1; return s; }
-S ++?( S & s ) { s += 1; return s; }
 int ?!=?( S s, zero_t ) { return s.i != 0 && s.j != 0; } // comparison
 void testInitAssignQueryIncrement() {
