Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision a93589218b787f36ca9d02a420b5d7b54ed5fc68)
+++ src/AST/Node.hpp	(revision dafe9e17b5724e86e06b513c6582c2dfa027d22a)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 8 10:27:04 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu May 23 16:00:00 2019
-// Update Count     : 4
+// Last Modified On : Mon Jun  3 13:26:00 2019
+// Update Count     : 5
 //
 
@@ -107,5 +107,5 @@
 	ptr_base() : node(nullptr) {}
 	ptr_base( const node_t * n ) : node(n) { if( node ) _inc(node); }
-	~ptr_base() { if( node ) _dec(node); }
+	~ptr_base() { if( node ) { auto tmp = node; node = nullptr; _dec(tmp); } }
 
 	ptr_base( const ptr_base & o ) : node(o.node) {
@@ -127,5 +127,5 @@
 	template<typename o_node_t>
 	ptr_base & operator=( const o_node_t * node ) {
-		assign( node ? strict_dynamic_cast<const node_t *>(node) : nullptr );
+		assign( strict_dynamic_cast<const node_t *, nullptr>(node) );
 		return *this;
 	}
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision a93589218b787f36ca9d02a420b5d7b54ed5fc68)
+++ src/AST/Type.hpp	(revision dafe9e17b5724e86e06b513c6582c2dfa027d22a)
@@ -48,4 +48,5 @@
 
 	Type * set_const( bool v ) { qualifiers.is_const = v; return this; }
+	Type * set_volatile( bool v ) { qualifiers.is_volatile = v; return this; }
 	Type * set_restrict( bool v ) { qualifiers.is_restrict = v; return this; }
 	Type * set_lvalue( bool v ) { qualifiers.is_lvalue = v; return this; }
Index: src/AST/TypeSubstitution.cpp
===================================================================
--- src/AST/TypeSubstitution.cpp	(revision a93589218b787f36ca9d02a420b5d7b54ed5fc68)
+++ src/AST/TypeSubstitution.cpp	(revision dafe9e17b5724e86e06b513c6582c2dfa027d22a)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 15:54:35 2017
-// Update Count     : 4
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jun  3 13:26:00 2017
+// Update Count     : 5
 //
 
@@ -26,12 +26,5 @@
 }
 
-TypeSubstitution::~TypeSubstitution() {
-	for ( TypeEnvType::iterator i = typeEnv.begin(); i != typeEnv.end(); ++i ) {
-		delete( i->second );
-	}
-	for ( VarEnvType::iterator i = varEnv.begin(); i != varEnv.end(); ++i ) {
-		delete( i->second );
-	}
-}
+TypeSubstitution::~TypeSubstitution() {}
 
 TypeSubstitution &TypeSubstitution::operator=( const TypeSubstitution &other ) {
Index: src/include/cassert
===================================================================
--- src/include/cassert	(revision a93589218b787f36ca9d02a420b5d7b54ed5fc68)
+++ src/include/cassert	(revision dafe9e17b5724e86e06b513c6582c2dfa027d22a)
@@ -10,6 +10,6 @@
 // Created On       : Thu Aug 18 13:19:26 2016
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu May 23 15:30:00 2017
-// Update Count     : 17
+// Last Modified On : Mon Jun  3 13:11:00 2017
+// Update Count     : 18
 //
 
@@ -43,15 +43,15 @@
 #endif
 
-enum StrictAllowNull {NonNull, AllowNull};
-
-template<typename T, StrictAllowNull nullable = NonNull, typename U>
+template<typename T, 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);
 	assertf(ret, "%s", toString(src).c_str());
 	return ret;
+}
+
+template<typename T, decltype(nullptr) null, typename U>
+static inline T strict_dynamic_cast( const U & src ) {
+	return src ? strict_dynamic_cast<T, U>( src ) : nullptr;
 }
 
