Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 7bd045d5cd87cfb5349b87a36b1a6619fc586aac)
+++ src/SymTab/Validate.cc	(revision e7ce55e6b1efd65eeb4a2660ffe5766410737608)
@@ -483,8 +483,10 @@
 
 	void ReturnChecker::visit( ReturnStmt * returnStmt ) {
+		// Previously this also checked for the existence of an expr paired with no return values on
+		// the  function return type. This is incorrect, since you can have an expression attached to
+		// a return statement in a void-returning function in C. The expression is treated as if it
+		// were cast to void.
 		if ( returnStmt->get_expr() == NULL && returnVals.size() != 0 ) {
 			throw SemanticError( "Non-void function returns no values: " , returnStmt );
-		} else if ( returnStmt->get_expr() != NULL && returnVals.size() == 0 ) {
-			throw SemanticError( "void function returns values: " , returnStmt );
 		}
 	}
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 7bd045d5cd87cfb5349b87a36b1a6619fc586aac)
+++ src/SynTree/Statement.cc	(revision e7ce55e6b1efd65eeb4a2660ffe5766410737608)
@@ -399,8 +399,9 @@
 }
 
-ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other ) : Statement( other ), callStmt( other.callStmt ) {
+ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other ) : Statement( other ), callStmt( maybeClone( other.callStmt ) ) {
 }
 
 ImplicitCtorDtorStmt::~ImplicitCtorDtorStmt() {
+	delete callStmt;
 }
 
