Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision d76c588058daa6269114595a571223a110ced0ab)
+++ src/AST/Convert.cpp	(revision 8d70648a1bc901be1455417052ead87a499b935b)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 09 15::37::05 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue May 28 12:00:00 2019
-// Update Count     : 7
+// Last Modified On : Wed May 29 17:05:00 2019
+// Update Count     : 9
 //
 
@@ -25,7 +25,10 @@
 #include "AST/TypeSubstitution.hpp"
 
+#include "SymTab/Autogen.h"
 #include "SynTree/Attribute.h"
 #include "SynTree/Declaration.h"
 #include "SynTree/TypeSubstitution.h"
+
+#include "Validate/FindSpecialDecls.h"
 
 //================================================================================================
@@ -40,4 +43,13 @@
 	}
 };
+
+//================================================================================================
+namespace {
+
+// This is to preserve the SymTab::dereferenceOperator hack. It does not (and perhaps should not)
+// allow us to use the same stratagy in the new ast.
+ast::FunctionDecl * dereferenceOperator = nullptr;
+
+}
 
 //================================================================================================
@@ -154,9 +166,14 @@
 			LinkageSpec::Spec( node->linkage.val ),
 			get<FunctionType>().accept1( node->type ),
-			get<CompoundStmt>().accept1( node->stmts ),
+			{},
 			get<Attribute>().acceptL( node->attributes ),
 			Type::FuncSpecifiers( node->funcSpec.val )
 		);
+		cache.emplace( node, decl );
+		decl->statements = get<CompoundStmt>().accept1( node->stmts );
 		decl->withExprs = get<Expression>().acceptL( node->withExprs );
+		if ( dereferenceOperator == node ) {
+			Validate::dereferenceOperator = decl;
+		}
 		return declWithTypePostamble( decl, node );
 	}
@@ -871,8 +888,4 @@
 		);
 
-		rslt->tempDecls = get<ObjectDecl>().acceptL(node->tempDecls);
-		rslt->returnDecls = get<ObjectDecl>().acceptL(node->returnDecls);
-		rslt->dtors = get<Expression>().acceptL(node->dtors);
-
 		auto expr = visitBaseExpr( node, rslt );
 		this->node = expr;
@@ -1425,5 +1438,5 @@
 			old->name,
 			GET_ACCEPT_1(type, FunctionType),
-			GET_ACCEPT_1(statements, CompoundStmt),
+			{},
 			{ old->storageClasses.val },
 			{ old->linkage.val },
@@ -1433,4 +1446,5 @@
 		cache.emplace( old, decl );
 		decl->withExprs = GET_ACCEPT_V(withExprs, Expr);
+		decl->stmts = GET_ACCEPT_1(statements, CompoundStmt);
 		decl->scopeLevel = old->scopeLevel;
 		decl->mangleName = old->mangleName;
@@ -1440,4 +1454,8 @@
 
 		this->node = decl;
+
+		if ( Validate::dereferenceOperator == old ) {
+			dereferenceOperator = decl;
+		}
 	}
 
@@ -1485,5 +1503,5 @@
 	virtual void visit( EnumDecl * old ) override final {
 		if ( inCache( old ) ) return;
-		auto decl = new ast::UnionDecl(
+		auto decl = new ast::EnumDecl(
 			old->location,
 			old->name,
@@ -1505,5 +1523,5 @@
 	virtual void visit( TraitDecl * old ) override final {
 		if ( inCache( old ) ) return;
-		auto decl = new ast::UnionDecl(
+		auto decl = new ast::TraitDecl(
 			old->location,
 			old->name,
@@ -2266,8 +2284,4 @@
 		);
 
-		rslt->tempDecls = GET_ACCEPT_V(tempDecls, ObjectDecl);
-		rslt->returnDecls = GET_ACCEPT_V(returnDecls, ObjectDecl);
-		rslt->dtors = GET_ACCEPT_V(dtors, Expr);
-
 		this->node = visitBaseExpr( old, rslt );
 	}
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision d76c588058daa6269114595a571223a110ced0ab)
+++ src/AST/Expr.hpp	(revision 8d70648a1bc901be1455417052ead87a499b935b)
@@ -530,10 +530,7 @@
 public:
 	ptr<ApplicationExpr> callExpr;
-	std::vector<ptr<ObjectDecl>> tempDecls;
-	std::vector<ptr<ObjectDecl>> returnDecls;
-	std::vector<ptr<Expr>> dtors;
 
 	ImplicitCopyCtorExpr( const CodeLocation& loc, const ApplicationExpr * call )
-	: Expr( loc, call->result ), tempDecls(), returnDecls(), dtors() { assert( call ); }
+	: Expr( loc, call->result ) { assert( call ); }
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision d76c588058daa6269114595a571223a110ced0ab)
+++ src/AST/Pass.impl.hpp	(revision 8d70648a1bc901be1455417052ead87a499b935b)
@@ -1319,7 +1319,4 @@
 		}
 		maybe_accept( node, &ImplicitCopyCtorExpr::callExpr    );
-		maybe_accept( node, &ImplicitCopyCtorExpr::tempDecls   );
-		maybe_accept( node, &ImplicitCopyCtorExpr::returnDecls );
-		maybe_accept( node, &ImplicitCopyCtorExpr::dtors       );
 	)
 
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision d76c588058daa6269114595a571223a110ced0ab)
+++ src/AST/Print.cpp	(revision 8d70648a1bc901be1455417052ead87a499b935b)
@@ -1023,8 +1023,4 @@
 		os << "Implicit Copy Constructor Expression:" << endl << indent;
 		safe_print( node->callExpr );
-		os << endl << indent-1 << "... with temporaries:" << endl;
-		printAll( node->tempDecls );
-		os << endl << indent-1 << "... with return temporaries:" << endl;
-		printAll( node->returnDecls );
 		--indent;
 		postprint( node );
