Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Common/utility.h	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -56,5 +56,4 @@
 }
 
-
 template< typename Input_iterator >
 void printEnums( Input_iterator begin, Input_iterator end, const char * const *name_array, std::ostream &os ) {
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/DeclarationNode.cc	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -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 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/ExpressionNode.cc	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -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 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/InitializerNode.cc	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -45,4 +45,6 @@
 InitializerNode::~InitializerNode() {
 	delete expr;
+	delete designator;
+	delete kids;
 }
 
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/ParseNode.h	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -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 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/StatementNode.cc	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -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 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/Parser/TypeData.cc	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -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
Index: src/include/assert.h
===================================================================
--- src/include/assert.h	(revision 80722d07c38e70225f74e0448996a46b64c82364)
+++ src/include/assert.h	(revision d30790faa8c3aa02f02c5d71926705f7e2dc2f94)
@@ -4,7 +4,7 @@
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
-// 
-// assert.h -- 
-// 
+//
+// assert.h --
+//
 // Author           : Peter A. Buhr
 // Created On       : Thu Aug 18 13:19:26 2016
@@ -12,5 +12,7 @@
 // Last Modified On : Thu Aug 18 13:25:55 2016
 // Update Count     : 4
-// 
+//
+
+#pragma once
 
 #include_next <assert.h>
@@ -22,4 +24,11 @@
 void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... );
 
+template<typename T, typename U>
+static inline T safe_dynamic_cast(const U& src) {
+	T ret = dynamic_cast<T>(src);
+	assert(ret);
+	return ret;
+}
+
 // Local Variables: //
 // tab-width: 4 //
