Index: doc/papers/general/Paper.tex
===================================================================
--- doc/papers/general/Paper.tex	(revision 8b001bdeaad8e72539cfc039fce69a37b18ee432)
+++ doc/papers/general/Paper.tex	(revision 3d8f2f86026604a24b204319c91718b436a6f37f)
@@ -2637,5 +2637,5 @@
 									& \CT{C}	& \CT{\CFA}	& \CT{\CC}	& \CT{\CCV}		\\ \hline
 maximum memory usage (MB)			& 10,001	& 2,502		& 2,503		& 11,253		\\
-source code size (lines)			& 197		& 186		& 133		& 303			\\
+source code size (lines)			& 197		& 186		& 125		& 293			\\
 redundant type annotations (lines)	& 27		& 0			& 2			& 16			\\
 binary size (KB)					& 14		& 257		& 14		& 37			\\
@@ -2906,4 +2906,54 @@
 }
 \end{cfa}
+
+\begin{comment}
+forall( otype T ) {
+	struct stack_node {
+		T value;
+		stack_node(T) * next;
+	};
+	struct stack { stack_node(T) * head; };
+	void clear( stack(T) & s ) with( s ) {
+		for ( stack_node(T) * next = head; next; ) {
+			stack_node(T) * crnt = next;
+			next = crnt->next;
+			^(*crnt){};
+			free(crnt);
+		}
+		head = 0;
+	}
+	void ?{}( stack(T) & s ) { (s.head){ 0 }; }
+	void ?{}( stack(T) & s, stack(T) t ) {
+		stack_node(T) ** crnt = &s.head;
+		for ( stack_node(T) * next = t.head; next; next = next->next ) {
+			*crnt = alloc();
+			((*crnt)->value){ next->value };
+			crnt = &(*crnt)->next;
+		}
+		*crnt = 0;
+	}
+	stack(T) ?=?( stack(T) & s, stack(T) t ) {
+		if ( s.head == t.head ) return s;
+		clear( s );
+		s{ t };
+		return s;
+	}
+	void ^?{}( stack(T) & s) { clear( s ); }
+	_Bool empty( const stack(T) & s ) { return s.head == 0; }
+	void push( stack(T) & s, T value ) with( s ) {
+		stack_node(T) * n = alloc();
+		(*n){ value, head };
+		head = n;
+	}
+	T pop( stack(T) & s ) with( s ) {
+		stack_node(T) * n = head;
+		head = n->next;
+		T v = n->value;
+		^(*n){};
+		free( n );
+		return v;
+	}
+}
+\end{comment}
 
 \medskip\noindent
@@ -2943,10 +2993,4 @@
 		return *this;
 	}
-	stack & operator= ( stack<T> && o ) {
-		if ( this == &o ) return *this;
-		head = o.head;
-		o.head = nullptr;
-		return *this;
-	}
 	bool empty() const { return head == nullptr; }
 	void push( const T & value ) { head = new node{ value, head };  /***/ }
@@ -2989,16 +3033,9 @@
 	stack() : head( nullptr ) {}
 	stack( const stack & o ) { copy( o ); }
-	stack( stack && o ) : head( o.head ) { o.head = nullptr; }
 	~stack() { clear(); }
-	stack & operator=( const stack & o ) {
+	stack & operator= ( const stack & o ) {
 		if ( this == &o ) return *this;
 		clear();
 		copy( o );
-		return *this;
-	}
-	stack & operator=( stack && o ) {
-		if ( this == &o ) return *this;
-		head = o.head;
-		o.head = nullptr;
 		return *this;
 	}
Index: doc/papers/general/evaluation/cpp-stack.hpp
===================================================================
--- doc/papers/general/evaluation/cpp-stack.hpp	(revision 8b001bdeaad8e72539cfc039fce69a37b18ee432)
+++ doc/papers/general/evaluation/cpp-stack.hpp	(revision 3d8f2f86026604a24b204319c91718b436a6f37f)
@@ -11,5 +11,5 @@
 
 	stack() : head( nullptr ) {}
-	stack( const stack<T> & o) { copy( o ); }
+	stack( const stack<T> & o ) { copy( o ); }
 	stack( stack<T> && o ) : head( o.head ) { o.head = nullptr; }
 
@@ -41,11 +41,4 @@
 	}
 
-	stack & operator= ( stack<T> && o ) {
-		if ( this == &o ) return *this;
-		head = o.head;
-		o.head = nullptr;
-		return *this;
-	}
-
 	bool empty() const { return head == nullptr; }
 
Index: doc/papers/general/evaluation/cpp-vstack.hpp
===================================================================
--- doc/papers/general/evaluation/cpp-vstack.hpp	(revision 8b001bdeaad8e72539cfc039fce69a37b18ee432)
+++ doc/papers/general/evaluation/cpp-vstack.hpp	(revision 3d8f2f86026604a24b204319c91718b436a6f37f)
@@ -17,7 +17,6 @@
 	stack( stack && o );
 	~stack();
-	stack& operator=( const stack& o );
-	stack& operator=( stack && o );
-
+	stack & operator=( const stack& o );
+	stack & operator=( stack && o );
 	bool empty() const;
 	void push( const object & value );
Index: doc/papers/general/evaluation/timing.dat
===================================================================
--- doc/papers/general/evaluation/timing.dat	(revision 8b001bdeaad8e72539cfc039fce69a37b18ee432)
+++ doc/papers/general/evaluation/timing.dat	(revision 3d8f2f86026604a24b204319c91718b436a6f37f)
@@ -1,9 +1,9 @@
 "400 million repetitions"	"C"	"\\CFA{}"	"\\CC{}"	"\\CC{obj}"
-"push\nint"	3002	2459	1520	3305
-"copy\nint"	2985	2057	1521	3152
-"clear\nint"	1374	827	718	1469
-"pop\nint"	1416	1221	717	5467
-"push\npair"	4214	2752	946	6826
-"copy\npair"	6127	2105	993	7330
-"clear\npair"	2881	885	711	3564
-"pop\npair"	3046	5434	783	26538
+"push\nint"	3002	2459	1542	3269
+"copy\nint"	2985	2057	1539	3083
+"clear\nint"	1374	827	756	1469
+"pop\nint"	1416	1221	760	5098
+"push\npair"	4214	2752	950	6873
+"copy\npair"	6127	2105	987	7293
+"clear\npair"	2881	885	751	3460
+"pop\npair"	3046	5434	822	24962
Index: doc/papers/general/evaluation/timing.gp
===================================================================
--- doc/papers/general/evaluation/timing.gp	(revision 8b001bdeaad8e72539cfc039fce69a37b18ee432)
+++ doc/papers/general/evaluation/timing.gp	(revision 3d8f2f86026604a24b204319c91718b436a6f37f)
@@ -24,5 +24,5 @@
 set yrange [0:10]
 
-set label "26.5" at 7.125,10.5
+set label "25.0" at 7.125,10.5
 
 # set datafile separator ","
