Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision b5978caa09b89dab28be8fb0df96edaf8c009d7d)
+++ src/AST/Expr.cpp	(revision 446dde5900727894be24c5a5f936130d83c10584)
@@ -393,20 +393,16 @@
 
 StmtExpr::StmtExpr( const CodeLocation & loc, const CompoundStmt * ss )
-: Expr( loc ), stmts( ss ), returnDecls(), dtors() { computeResult(); }
+: Expr( loc ), stmts( ss ) { computeResult(); }
 
 void StmtExpr::computeResult() {
 	assert( stmts );
 	const std::list<ptr<Stmt>> & body = stmts->kids;
-	if ( ! returnDecls.empty() ) {
-		// prioritize return decl for result type, since if a return decl exists, then the StmtExpr
-		// is currently in an intermediate state where the body will always give a void result type
-		result = returnDecls.front()->get_type();
-	} else if ( ! body.empty() ) {
-		if ( const ExprStmt * exprStmt = body.back().as< ExprStmt >() ) {
-			result = exprStmt->expr->result;
-		}
-	}
-	// ensure a result type exists
-	if ( ! result ) { result = new VoidType{}; }
+	// If there is a tail expression, its result is entire result.
+	if ( !body.empty() && ( resultExpr = body.back().as<ExprStmt>() ) ) {
+		result = resultExpr->expr->result;
+	// Otherwise, fill in the result with void so there is a result type.
+	} else {
+		result = new VoidType();
+	}
 }
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision b5978caa09b89dab28be8fb0df96edaf8c009d7d)
+++ src/AST/Expr.hpp	(revision 446dde5900727894be24c5a5f936130d83c10584)
@@ -782,6 +782,4 @@
 public:
 	ptr<CompoundStmt> stmts;
-	std::vector<ptr<ObjectDecl>> returnDecls;  ///< return variable(s) for statement expression
-	std::vector<ptr<Expr>> dtors;              ///< destructor(s) for return variable(s)
 
 	readonly<ExprStmt> resultExpr;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision b5978caa09b89dab28be8fb0df96edaf8c009d7d)
+++ src/AST/Pass.impl.hpp	(revision 446dde5900727894be24c5a5f936130d83c10584)
@@ -1697,6 +1697,4 @@
 		}
 		maybe_accept( node, &StmtExpr::stmts       );
-		maybe_accept( node, &StmtExpr::returnDecls );
-		maybe_accept( node, &StmtExpr::dtors       );
 	}
 
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision b5978caa09b89dab28be8fb0df96edaf8c009d7d)
+++ src/AST/Print.cpp	(revision 446dde5900727894be24c5a5f936130d83c10584)
@@ -1406,12 +1406,4 @@
 		os << "Statement Expression:" << endl << indent;
 		safe_print( node->stmts );
-		if ( ! node->returnDecls.empty() ) {
-			os << indent << "... with returnDecls: ";
-			printAll( node->returnDecls );
-		}
-		if ( ! node->dtors.empty() ) {
-			os << indent << "... with dtors: ";
-			printAll( node->dtors );
-		}
 		--indent;
 		postprint( node );
