Index: libcfa/prelude/builtins.c
===================================================================
--- libcfa/prelude/builtins.c	(revision 283fbddd969525e9694abcb709bc45b284c7f7ea)
+++ 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
