Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision d5916ce34e5508e6ffe903e16992dee102292838)
+++ src/SymTab/Autogen.cc	(revision 2bfc6b281e65c5e8bdf4d021589a170c2cb15418)
@@ -41,6 +41,4 @@
 
 namespace SymTab {
-	Type * SizeType = 0;
-
 	/// Data used to generate functions generically. Specifically, the name of the generated function and a function which generates the routine protoype
 	struct FuncData {
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision d5916ce34e5508e6ffe903e16992dee102292838)
+++ src/SymTab/Autogen.h	(revision 2bfc6b281e65c5e8bdf4d021589a170c2cb15418)
@@ -36,12 +36,4 @@
 	/// returns true if obj's name is the empty string and it has a bitfield width
 	bool isUnnamedBitfield( ObjectDecl * obj );
-
-	/// size_t type - set when size_t typedef is seen. Useful in a few places,
-	/// such as in determining array dimension type
-	extern Type * SizeType;
-
-	/// intrinsic dereference operator for unqualified types - set when *? function is seen in FindSpecialDeclarations.
-	/// Useful for creating dereference ApplicationExprs without a full resolver pass.
-	extern FunctionDecl * dereferenceOperator;
 
 	/// generate the type of an assignment function for paramType.
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision d5916ce34e5508e6ffe903e16992dee102292838)
+++ src/SymTab/Validate.cc	(revision 2bfc6b281e65c5e8bdf4d021589a170c2cb15418)
@@ -75,4 +75,5 @@
 #include "SynTree/Visitor.h"           // for Visitor
 #include "Validate/HandleAttributes.h" // for handleAttributes
+#include "Validate/FindSpecialDecls.h" // for FindSpecialDecls
 
 class CompoundStmt;
@@ -287,9 +288,4 @@
 	};
 
-	FunctionDecl * dereferenceOperator = nullptr;
-	struct FindSpecialDeclarations final {
-		void previsit( FunctionDecl * funcDecl );
-	};
-
 	void validate( std::list< Declaration * > &translationUnit, __attribute__((unused)) bool doDebug ) {
 		PassVisitor<EnumAndPointerDecay> epc;
@@ -298,5 +294,4 @@
 		PassVisitor<CompoundLiteral> compoundliteral;
 		PassVisitor<ValidateGenericParameters> genericParams;
-		PassVisitor<FindSpecialDeclarations> finder;
 		PassVisitor<LabelAddressFixer> labelAddrFixer;
 		PassVisitor<HoistTypeDecls> hoistDecls;
@@ -325,5 +320,5 @@
 		FixObjectType::fix( translationUnit );
 		ArrayLength::computeLength( translationUnit );
-		acceptAll( translationUnit, finder ); // xxx - remove this pass soon
+		Validate::findSpecialDecls( translationUnit );
 		mutateAll( translationUnit, labelAddrFixer );
 		Validate::handleAttributes( translationUnit );
@@ -901,9 +896,9 @@
 		if ( eliminator.pass.typedefNames.count( "size_t" ) ) {
 			// grab and remember declaration of size_t
-			SizeType = eliminator.pass.typedefNames["size_t"].first->base->clone();
+			Validate::SizeType = eliminator.pass.typedefNames["size_t"].first->base->clone();
 		} else {
 			// xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong
 			// eventually should have a warning for this case.
-			SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+			Validate::SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
 		}
 	}
@@ -1293,5 +1288,5 @@
 			// need to resolve array dimensions early so that constructor code can correctly determine
 			// if a type is a VLA (and hence whether its elements need to be constructed)
-			ResolvExpr::findSingleExpression( type->dimension, SymTab::SizeType->clone(), indexer );
+			ResolvExpr::findSingleExpression( type->dimension, Validate::SizeType->clone(), indexer );
 
 			// must re-evaluate whether a type is a VLA, now that more information is available
@@ -1330,22 +1325,4 @@
 		return addrExpr;
 	}
-
-	void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) {
-		if ( ! dereferenceOperator ) {
-			// find and remember the intrinsic dereference operator for object pointers
-			if ( funcDecl->name == "*?" && funcDecl->linkage == LinkageSpec::Intrinsic ) {
-				FunctionType * ftype = funcDecl->type;
-				if ( ftype->parameters.size() == 1 ) {
-					PointerType * ptrType = strict_dynamic_cast<PointerType *>( ftype->parameters.front()->get_type() );
-					if ( ptrType->base->get_qualifiers() == Type::Qualifiers() ) {
-						TypeInstType * inst = dynamic_cast<TypeInstType *>( ptrType->base );
-						if ( inst && ! inst->get_isFtype() ) {
-							dereferenceOperator = funcDecl;
-						}
-					}
-				}
-			}
-		}
-	}
 } // namespace SymTab
 
