Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/DeclarationNode.cc	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -230,5 +230,5 @@
 	DeclarationNode *newnode = new DeclarationNode;
 	newnode->name = assign_strptr( name );
-	newnode->enumeratorValue = constant;
+	newnode->enumeratorValue.reset( constant );
 	typedefTable.addToEnclosingScope( newnode->name, TypedefTable::ID );
 	return newnode;
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/ExpressionNode.cc	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -183,5 +183,5 @@
 
 Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) {
-	Type *targetType = decl_node->buildType();
+	Type *targetType = maybeMoveBuildType( decl_node );
 	if ( dynamic_cast< VoidType * >( targetType ) ) {
 		delete targetType;
@@ -213,7 +213,5 @@
 }
 Expression *build_sizeOftype( DeclarationNode *decl_node ) {
-	Expression* ret = new SizeofExpr( decl_node->buildType() );
-	delete decl_node;
-	return ret;
+	return new SizeofExpr( maybeMoveBuildType( decl_node ) );
 }
 Expression *build_alignOfexpr( ExpressionNode *expr_node ) {
@@ -221,9 +219,8 @@
 }
 Expression *build_alignOftype( DeclarationNode *decl_node ) {
-	return new AlignofExpr( decl_node->buildType() );
+	return new AlignofExpr( maybeMoveBuildType( decl_node) );
 }
 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) {
-	Expression* ret = new UntypedOffsetofExpr( decl_node->buildType(), member->get_name() );
-	delete decl_node;
+	Expression* ret = new UntypedOffsetofExpr( maybeMoveBuildType( decl_node ), member->get_name() );
 	delete member;
 	return ret;
@@ -269,5 +266,5 @@
 }
 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) {
-	return new AttrExpr( var, decl_node->buildType() );
+	return new AttrExpr( var, maybeMoveBuildType( decl_node ) );
 }
 
@@ -296,5 +293,5 @@
 }
 Expression *build_typevalue( DeclarationNode *decl ) {
-	return new TypeExpr( decl->buildType() );
+	return new TypeExpr( maybeMoveBuildType( decl ) );
 }
 
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/InitializerNode.cc	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -45,4 +45,6 @@
 InitializerNode::~InitializerNode() {
 	delete expr;
+	delete designator;
+	delete kids;
 }
 
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/ParseNode.h	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -280,5 +280,6 @@
 	LinkageSpec::Spec get_linkage() const { return linkage; }
 	DeclarationNode *extractAggregate() const;
-	ExpressionNode *get_enumeratorValue() const { return enumeratorValue; }
+	bool has_enumeratorValue() const { return (bool)enumeratorValue; }
+	ExpressionNode *consume_enumeratorValue() const { return const_cast<DeclarationNode*>(this)->enumeratorValue.release(); }
 
 	bool get_extension() const { return extension; }
@@ -295,5 +296,5 @@
 	std::list< std::string > attributes;
 	ExpressionNode *bitfieldWidth;
-	ExpressionNode *enumeratorValue;
+	std::unique_ptr<ExpressionNode> enumeratorValue;
 	InitializerNode *initializer;
 	bool hasEllipsis;
@@ -306,4 +307,10 @@
 
 Type *buildType( TypeData *type );
+
+static inline Type * maybeMoveBuildType( const DeclarationNode *orig ) {
+	Type* ret = orig ? orig->buildType() : nullptr;
+	delete orig;
+	return ret;
+}
 
 //##############################################################################
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/StatementNode.cc	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -54,6 +54,5 @@
 	// find end of list and maintain previous pointer
 	for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) {
-		StatementNode *node = dynamic_cast< StatementNode * >(curr);
-		assert( node );
+		StatementNode *node = safe_dynamic_cast< StatementNode * >(curr);
 		assert( dynamic_cast< CaseStmt * >(node->stmt.get()) );
 		prev = curr;
@@ -160,6 +159,5 @@
 	std::list< Statement * > branches;
 	buildMoveList< Statement, StatementNode >( catch_stmt, branches );
-	CompoundStmt *tryBlock = dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(try_stmt));
-	assert( tryBlock );
+	CompoundStmt *tryBlock = safe_dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(try_stmt));
 	FinallyStmt *finallyBlock = dynamic_cast< FinallyStmt * >(maybeMoveBuild< Statement >(finally_stmt) );
 	return new TryStmt( noLabels, tryBlock, branches, finallyBlock );
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 2037f825f430b877faa16f93128ab3695c632dc3)
+++ src/Parser/TypeData.cc	(revision 4f147ccf8275e5b1c57a2d5be8cda9f90d91279f)
@@ -909,7 +909,7 @@
 	std::list< Declaration * >::iterator members = ret->get_members().begin();
 	for ( const DeclarationNode *cur = enumeration->constants; cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
-		if ( cur->get_enumeratorValue() != nullptr ) {
+		if ( cur->has_enumeratorValue() ) {
 			ObjectDecl *member = dynamic_cast< ObjectDecl * >(*members);
-			member->set_init( new SingleInit( maybeBuild< Expression >( cur->get_enumeratorValue() ), std::list< Expression * >() ) );
+			member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ), std::list< Expression * >() ) );
 		} // if
 	} // for
