Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision d56c05d0943d88c5d163c26b5c1c91bfb8f39345)
+++ src/SymTab/Validate.cc	(revision 74d1804d72905cf06786275cfde2ae94369611fb)
@@ -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 d56c05d0943d88c5d163c26b5c1c91bfb8f39345)
+++ src/SynTree/Statement.cc	(revision 74d1804d72905cf06786275cfde2ae94369611fb)
@@ -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;
 }
 
