Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/AST/Convert.cpp	(revision f685679ccf556a852ac2dfac5c217d0fcf9ca7f1)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 09 15::37::05 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue May 21 15:30:00 2019
-// Update Count     : 5
+// Last Modified On : Thu May 23 16:59:00 2019
+// Update Count     : 6
 //
 
@@ -121,5 +121,5 @@
 	const ast::DeclWithType * declWithTypePostamble (
 			DeclarationWithType * decl, const ast::DeclWithType * node ) {
-		declPostamble( decl, node );
+		cache.emplace( node, decl );
 		decl->mangleName = node->mangleName;
 		decl->scopeLevel = node->scopeLevel;
@@ -128,5 +128,5 @@
 		decl->isDeleted = node->isDeleted;
 		// fs comes from constructor
-		cache.emplace( node, decl );
+		declPostamble( decl, node );
 		return nullptr;
 	}
@@ -162,10 +162,9 @@
 	}
 
-	// NamedTypeDecl
 	const ast::Decl * namedTypePostamble( NamedTypeDecl * decl, const ast::NamedTypeDecl * node ) {
-		declPostamble( decl, node );
 		// base comes from constructor
 		decl->parameters = get<TypeDecl>().acceptL( node->params );
 		decl->assertions = get<DeclarationWithType>().acceptL( node->assertions );
+		declPostamble( decl, node );
 		return nullptr;
 	}
@@ -197,4 +196,5 @@
 
 	const ast::Decl * aggregatePostamble( AggregateDecl * decl, const ast::AggregateDecl * node ) {
+		cache.emplace( node, decl );
 		decl->members = get<Declaration>().acceptL( node->members );
 		decl->parameters = get<TypeDecl>().acceptL( node->params );
@@ -202,5 +202,5 @@
 		// attributes come from constructor
 		decl->parent = get<AggregateDecl>().accept1( node->parent );
-		cache.emplace( node, decl );
+		declPostamble( decl, node );
 		return nullptr;
 	}
@@ -263,7 +263,7 @@
 
 	const ast::Stmt * stmtPostamble( Statement * stmt, const ast::Stmt * node ) {
+		cache.emplace( node, stmt );
 		stmt->location = node->location;
 		stmt->labels = makeLabelL( stmt, node->labels );
-		cache.emplace( node, stmt );
 		this->node = stmt;
 		return nullptr;
@@ -279,5 +279,7 @@
 	const ast::Stmt * visit( const ast::ExprStmt * node ) override final {
 		if ( inCache( node ) ) return nullptr;
-		auto stmt = new ExprStmt( get<Expression>().accept1( node->expr ) );
+		auto stmt = new ExprStmt( nullptr );
+		cache.emplace( node, stmt );
+		stmt->expr = get<Expression>().accept1( node->expr );
 		return stmtPostamble( stmt, node );
 	}
@@ -508,4 +510,6 @@
 	TypeSubstitution * convertTypeSubstitution(const ast::TypeSubstitution * src) {
 
+		if (!src) return nullptr;
+
 		TypeSubstitution *rslt = new TypeSubstitution();
 
@@ -1902,10 +1906,12 @@
 	virtual void visit( ImplicitCtorDtorStmt * old ) override final {
 		if ( inCache( old ) ) return;
-		this->node = new ast::ImplicitCtorDtorStmt(
-			old->location,
-			GET_ACCEPT_1(callStmt, Stmt),
+		auto stmt = new ast::ImplicitCtorDtorStmt(
+			old->location,
+			nullptr,
 			GET_LABELS_V(old->labels)
 		);
+		this->node = stmt;
 		cache.emplace( old, this->node );
+		stmt->callStmt = GET_ACCEPT_1(callStmt, Stmt);
 	}
 
Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/AST/Node.hpp	(revision f685679ccf556a852ac2dfac5c217d0fcf9ca7f1)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 8 10:27:04 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed May 15 16:02:00 2019
-// Update Count     : 3
+// Last Modified On : Thu May 23 16:00:00 2019
+// Update Count     : 4
 //
 
@@ -109,4 +109,12 @@
 	~ptr_base() { if( node ) _dec(node); }
 
+	ptr_base( const ptr_base & o ) : node(o.node) {
+		if( node ) _inc(node);
+	}
+
+	ptr_base( ptr_base && o ) : node(o.node) {
+		if( node ) _inc(node);
+	}
+
 	template< enum Node::ref_type o_ref_t >
 	ptr_base( const ptr_base<node_t, o_ref_t> & o ) : node(o.node) {
@@ -122,4 +130,14 @@
 	ptr_base & operator=( const o_node_t * node ) {
 		assign( node ? strict_dynamic_cast<const node_t *>(node) : nullptr );
+		return *this;
+	}
+
+	ptr_base & operator=( const ptr_base & o ) {
+		assign(o.node);
+		return *this;
+	}
+
+	ptr_base & operator=( ptr_base && o ) {
+		assign(o.node);
 		return *this;
 	}
Index: src/include/cassert
===================================================================
--- src/include/cassert	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/include/cassert	(revision f685679ccf556a852ac2dfac5c217d0fcf9ca7f1)
@@ -9,7 +9,7 @@
 // Author           : Peter A. Buhr
 // Created On       : Thu Aug 18 13:19:26 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Aug  1 11:56:01 2017
-// Update Count     : 16
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu May 23 15:30:00 2017
+// Update Count     : 17
 //
 
@@ -43,6 +43,11 @@
 #endif
 
-template<typename T, typename U>
-static inline __attribute__((nonnull)) T strict_dynamic_cast( const U & src ) {
+enum StrictAllowNull {NonNull, AllowNull};
+
+template<typename T, StrictAllowNull nullable = NonNull, typename U>
+static inline T strict_dynamic_cast( const U & src ) {
+	if (nullable == AllowNull && src == nullptr) {
+		return nullptr;
+	}
 	assert(src);
 	T ret = dynamic_cast<T>(src);
