Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/CodeGen/CodeGenerator.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -20,9 +20,8 @@
 #include <string>                 // for string
 
+#include "Common/Indenter.h"      // for Indenter
 #include "SynTree/Declaration.h"  // for DeclarationWithType (ptr only), Fun...
 #include "SynTree/Visitor.h"      // for Visitor
 #include "SynTree/SynTree.h"      // for Visitor Nodes
-
-#include "Common/Indenter.h"      // for Indenter
 
 namespace CodeGen {
Index: src/CodeTools/TrackLoc.cc
===================================================================
--- src/CodeTools/TrackLoc.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/CodeTools/TrackLoc.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -18,4 +18,5 @@
 #include <cstdlib>                   // for exit, EXIT_FAILURE
 #include <iostream>                  // for operator<<, ostream, basic_ostream
+#include <iterator>                  // for back_inserter, inserter
 #include <stack>                     // for stack
 #include <string>                    // for operator<<, string
@@ -23,6 +24,9 @@
 
 #include "Common/PassVisitor.h"      // for PassVisitor
+#include "Common/SemanticError.h"    // for SemanticError
 #include "Common/utility.h"          // for CodeLocation
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
+#include "SynTree/Mutator.h"         // for mutateAll
+#include "SynTree/Visitor.h"         // for acceptAll
 
 class Declaration;
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/Common/PassVisitor.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -1,3 +1,5 @@
 #pragma once
+
+// IWYU pragma: private, include "Common/PassVisitor.h"
 
 #include <stack>
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/Concurrency/Keywords.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -23,5 +23,4 @@
 #include "InitTweak/InitTweak.h"   // for isConstructor
 #include "Parser/LinkageSpec.h"    // for Cforall
-#include "SymTab/AddVisit.h"       // for acceptAndAdd
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Box.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,50 +14,44 @@
 //
 
-#include <algorithm>
-#include <iterator>
-#include <list>
-#include <map>
-#include <set>
-#include <stack>
-#include <string>
-#include <utility>
-#include <vector>
-#include <cassert>
+#include <algorithm>                     // for mismatch
+#include <cassert>                       // for assert, safe_dynamic_cast
+#include <iostream>                      // for operator<<, stringstream
+#include <list>                          // for list, list<>::iterator, _Lis...
+#include <map>                           // for _Rb_tree_const_iterator, map
+#include <memory>                        // for auto_ptr
+#include <set>                           // for set
+#include <string>                        // for string, allocator, basic_string
+#include <utility>                       // for pair
 
 #include "Box.h"
-#include "DeclMutator.h"
-#include "Lvalue.h"
-#include "FindFunction.h"
-#include "PolyMutator.h"
-#include "ScopedSet.h"
-#include "ScrubTyVars.h"
-
-#include "Parser/ParseNode.h"
-
-#include "SynTree/Attribute.h"
-#include "SynTree/Constant.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Initializer.h"
-#include "SynTree/Mutator.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Type.h"
-#include "SynTree/TypeSubstitution.h"
-
-#include "ResolvExpr/TypeEnvironment.h"
-#include "ResolvExpr/TypeMap.h"
-#include "ResolvExpr/typeops.h"
-
-#include "SymTab/Indexer.h"
-#include "SymTab/Mangler.h"
-
-#include "Common/ScopedMap.h"
-#include "Common/SemanticError.h"
-#include "Common/UniqueName.h"
-#include "Common/utility.h"
-
-#include "InitTweak/InitTweak.h"
-
-#include <ext/functional> // temporary
+#include "Common/ScopedMap.h"            // for ScopedMap, ScopedMap<>::iter...
+#include "Common/SemanticError.h"        // for SemanticError
+#include "Common/UniqueName.h"           // for UniqueName
+#include "Common/utility.h"              // for toString
+#include "DeclMutator.h"                 // for DeclMutator
+#include "FindFunction.h"                // for findFunction, findAndReplace...
+#include "GenPoly/ErasableScopedMap.h"   // for ErasableScopedMap<>::const_i...
+#include "GenPoly/GenPoly.h"             // for TyVarMap, isPolyType, mangle...
+#include "InitTweak/InitTweak.h"         // for getFunctionName, isAssignment
+#include "Lvalue.h"                      // for generalizedLvalue
+#include "Parser/LinkageSpec.h"          // for C, Spec, Cforall, Intrinsic
+#include "PolyMutator.h"                 // for PolyMutator
+#include "ResolvExpr/TypeEnvironment.h"  // for EqvClass
+#include "ResolvExpr/typeops.h"          // for typesCompatible
+#include "ScopedSet.h"                   // for ScopedSet, ScopedSet<>::iter...
+#include "ScrubTyVars.h"                 // for ScrubTyVars
+#include "SymTab/Indexer.h"              // for Indexer
+#include "SymTab/Mangler.h"              // for Mangler
+#include "SynTree/Attribute.h"           // for Attribute
+#include "SynTree/Constant.h"            // for Constant
+#include "SynTree/Declaration.h"         // for DeclarationWithType, ObjectDecl
+#include "SynTree/Expression.h"          // for ApplicationExpr, UntypedExpr
+#include "SynTree/Initializer.h"         // for SingleInit, Initializer, Lis...
+#include "SynTree/Label.h"               // for Label, noLabels
+#include "SynTree/Mutator.h"             // for maybeMutate, Mutator, mutateAll
+#include "SynTree/Statement.h"           // for ExprStmt, DeclStmt, ReturnStmt
+#include "SynTree/SynTree.h"             // for UniqueId
+#include "SynTree/Type.h"                // for Type, FunctionType, PointerType
+#include "SynTree/TypeSubstitution.h"    // for TypeSubstitution, operator<<
 
 namespace GenPoly {
Index: src/GenPoly/Box.h
===================================================================
--- src/GenPoly/Box.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Box.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,6 +16,7 @@
 #pragma once
 
-#include <list>
-#include "SynTree/SynTree.h"
+#include <list>  // for list
+
+class Declaration;
 
 namespace GenPoly {
Index: src/GenPoly/CopyParams.cc
===================================================================
--- src/GenPoly/CopyParams.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/CopyParams.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,14 +14,20 @@
 //
 
-#include <set>
-#include <map>
-#include <cassert>
+#include <cassert>                 // for assert
+#include <list>                    // for list, _List_iterator, _List_const_...
+#include <map>                     // for map, _Rb_tree_const_iterator, map<...
+#include <set>                     // for set, set<>::const_iterator
+#include <string>                  // for string, operator==
+#include <utility>                 // for pair
 
-#include "SynTree/Declaration.h"
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Visitor.h"
-#include "Common/UniqueName.h"
+#include "Common/SemanticError.h"  // for SemanticError
+#include "Common/UniqueName.h"     // for UniqueName
+#include "SynTree/Declaration.h"   // for DeclarationWithType, TypeDecl, Fun...
+#include "SynTree/Expression.h"    // for VariableExpr, ApplicationExpr, Add...
+#include "SynTree/Label.h"         // for Label, noLabels
+#include "SynTree/Statement.h"     // for CompoundStmt, DeclStmt, ExprStmt
+#include "SynTree/SynTree.h"       // for UniqueId
+#include "SynTree/Type.h"          // for FunctionType, TypeInstType, Type
+#include "SynTree/Visitor.h"       // for acceptAll, Visitor
 
 namespace GenPoly {
Index: src/GenPoly/DeclMutator.cc
===================================================================
--- src/GenPoly/DeclMutator.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/DeclMutator.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,6 +16,11 @@
 #include "DeclMutator.h"
 
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
+#include <memory>                  // for allocator_traits<>::value_type
+
+#include "Common/SemanticError.h"  // for SemanticError
+#include "SynTree/Declaration.h"   // for Declaration
+#include "SynTree/Expression.h"    // for Expression
+#include "SynTree/Label.h"         // for Label, noLabels
+#include "SynTree/Statement.h"     // for CatchStmt, Statement, CompoundStmt
 
 namespace GenPoly {
Index: src/GenPoly/DeclMutator.h
===================================================================
--- src/GenPoly/DeclMutator.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/DeclMutator.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,10 +16,9 @@
 #pragma once
 
-#include <list>
-#include <vector>
+#include <list>               // for list
+#include <vector>             // for vector
 
-#include "SynTree/SynTree.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Mutator.h"
+#include "SynTree/Mutator.h"  // for Mutator
+#include "SynTree/SynTree.h"  // for Visitor Nodes
 
 namespace GenPoly {
Index: src/GenPoly/FindFunction.cc
===================================================================
--- src/GenPoly/FindFunction.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/FindFunction.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -15,9 +15,14 @@
 
 #include "FindFunction.h"
-#include "SynTree/Type.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Visitor.h"
 
-#include "ScrubTyVars.h"
+#include <utility>                      // for pair
+
+#include "Common/SemanticError.h"       // for SemanticError
+#include "GenPoly/ErasableScopedMap.h"  // for ErasableScopedMap<>::iterator
+#include "GenPoly/GenPoly.h"            // for TyVarMap
+#include "ScrubTyVars.h"                // for ScrubTyVars
+#include "SynTree/Declaration.h"        // for DeclarationWithType, TypeDecl
+#include "SynTree/Mutator.h"            // for Mutator, mutateAll
+#include "SynTree/Type.h"               // for FunctionType, Type, Type::For...
 
 namespace GenPoly {
Index: src/GenPoly/FindFunction.h
===================================================================
--- src/GenPoly/FindFunction.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/FindFunction.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,6 +16,10 @@
 #pragma once
 
-#include "SynTree/SynTree.h"
-#include "GenPoly.h"
+#include <list>       // for list
+
+#include "GenPoly.h"  // for TyVarMap
+
+class FunctionType;
+class Type;
 
 namespace GenPoly {
Index: src/GenPoly/GenPoly.cc
===================================================================
--- src/GenPoly/GenPoly.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/GenPoly.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -15,16 +15,20 @@
 
 #include "GenPoly.h"
-#include "assert.h"
-
-#include "SynTree/Expression.h"
-#include "SynTree/Type.h"
-#include "ResolvExpr/typeops.h"
-
-#include <iostream>
-#include <iterator>
-#include <list>
-#include <typeindex>
-#include <typeinfo>
-#include <vector>
+
+#include <cassert>                      // for assertf, assert
+#include <iostream>                     // for operator<<, ostream, basic_os...
+#include <iterator>                     // for back_insert_iterator, back_in...
+#include <list>                         // for list, _List_iterator, list<>:...
+#include <typeindex>                    // for type_index
+#include <utility>                      // for pair
+#include <vector>                       // for vector
+
+#include "GenPoly/ErasableScopedMap.h"  // for ErasableScopedMap<>::const_it...
+#include "ResolvExpr/typeops.h"         // for flatten
+#include "SynTree/Constant.h"           // for Constant
+#include "SynTree/Expression.h"         // for Expression, TypeExpr, Constan...
+#include "SynTree/Type.h"               // for Type, StructInstType, UnionIn...
+#include "SynTree/TypeSubstitution.h"   // for TypeSubstitution
+
 using namespace std;
 
Index: src/GenPoly/GenPoly.h
===================================================================
--- src/GenPoly/GenPoly.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/GenPoly.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,15 +16,11 @@
 #pragma once
 
-#include <string>
-#include <iostream>
-#include <utility>
+#include <iostream>               // for ostream
+#include <string>                 // for string, allocator, operator+, basic...
 
-#include "ErasableScopedMap.h"
-
-#include "SymTab/Mangler.h"
-
-#include "SynTree/Declaration.h"
-#include "SynTree/Type.h"
-#include "SynTree/TypeSubstitution.h"
+#include "ErasableScopedMap.h"    // for ErasableScopedMap
+#include "SymTab/Mangler.h"       // for Mangler
+#include "SynTree/Declaration.h"  // for TypeDecl::Data, AggregateDecl, Type...
+#include "SynTree/SynTree.h"      // for Visitor Nodes
 
 namespace GenPoly {
@@ -66,9 +62,9 @@
 	Type *hasPolyBase( Type *type, const TyVarMap &tyVars, int *levels = 0, const TypeSubstitution *env = 0 );
 
-	/// true iff this type or some base of this type after dereferencing pointers is either polymorphic or a generic type with at least one 
+	/// true iff this type or some base of this type after dereferencing pointers is either polymorphic or a generic type with at least one
 	/// polymorphic parameter; will look up substitution in env if provided.
 	bool includesPolyType( Type *type, const TypeSubstitution *env = 0 );
 
-	/// true iff this type or some base of this type after dereferencing pointers is either polymorphic in tyVars, or a generic type with 
+	/// true iff this type or some base of this type after dereferencing pointers is either polymorphic in tyVars, or a generic type with
 	/// at least one polymorphic parameter in tyVars; will look up substitution in env if provided.
 	bool includesPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,29 +14,26 @@
 //
 
-#include <cassert>
-#include <list>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
+#include <cassert>                     // for assertf, assert
+#include <iterator>                    // for back_inserter, inserter
+#include <list>                        // for list, _List_const_iterator
+#include <utility>                     // for move, pair
+#include <vector>                      // for vector
+
+#include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
+#include "Common/ScopedMap.h"          // for ScopedMap
+#include "Common/SemanticError.h"      // for SemanticError
+#include "Common/UniqueName.h"         // for UniqueName
+#include "Common/utility.h"            // for deleteAll, cloneAll
+#include "GenPoly.h"                   // for isPolyType, typesPolyCompatible
 #include "InstantiateGeneric.h"
-
-#include "GenPoly.h"
-#include "ScopedSet.h"
-#include "ScrubTyVars.h"
-
-#include "Common/PassVisitor.h"
-#include "Common/ScopedMap.h"
-#include "Common/UniqueName.h"
-#include "Common/utility.h"
-
-#include "ResolvExpr/typeops.h"
-
-#include "SynTree/Declaration.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Type.h"
-
-
-#include "InitTweak/InitTweak.h"
+#include "PassVisitor.h"               // for mutateAll
+#include "ScopedSet.h"                 // for ScopedSet, ScopedSet<>::iterator
+#include "ScrubTyVars.h"               // for ScrubTyVars
+#include "SynTree/Declaration.h"       // for StructDecl, UnionDecl, TypeDecl
+#include "SynTree/Expression.h"        // for TypeExpr, Expression
+#include "SynTree/Mutator.h"           // for mutateAll
+#include "SynTree/Type.h"              // for StructInstType, UnionInstType
+#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
+#include "SynTree/Visitor.h"           // for acceptAll
 
 
Index: src/GenPoly/InstantiateGeneric.h
===================================================================
--- src/GenPoly/InstantiateGeneric.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/InstantiateGeneric.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,5 +16,7 @@
 #pragma once
 
-#include "SynTree/SynTree.h"
+#include <list>  // for list
+
+class Declaration;
 
 namespace GenPoly {
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Lvalue.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,25 +14,20 @@
 //
 
-#include <cassert>
-
+#include <cassert>                       // for safe_dynamic_cast
+#include <string>                        // for string
+
+#include "Common/SemanticError.h"        // for SemanticError
+#include "GenPoly.h"                     // for isPolyType
 #include "Lvalue.h"
-
-#include "GenPoly.h"
-
-#include "SynTree/Declaration.h"
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Visitor.h"
-#include "SynTree/Mutator.h"
-#include "SymTab/Indexer.h"
-
-#include "ResolvExpr/Resolver.h"
-#include "ResolvExpr/TypeEnvironment.h"
-#include "ResolvExpr/typeops.h"
-#include "ResolvExpr/Unify.h"
-
-#include "Common/UniqueName.h"
-#include "Common/utility.h"
+#include "Parser/LinkageSpec.h"          // for Spec, isBuiltin, Intrinsic
+#include "ResolvExpr/TypeEnvironment.h"  // for AssertionSet, OpenVarSet
+#include "ResolvExpr/Unify.h"            // for unify
+#include "SymTab/Indexer.h"              // for Indexer
+#include "SynTree/Declaration.h"         // for Declaration, FunctionDecl
+#include "SynTree/Expression.h"          // for Expression, ConditionalExpr
+#include "SynTree/Mutator.h"             // for mutateAll, Mutator
+#include "SynTree/Statement.h"           // for ReturnStmt, Statement (ptr o...
+#include "SynTree/Type.h"                // for PointerType, Type, FunctionType
+#include "SynTree/Visitor.h"             // for Visitor, acceptAll
 
 namespace GenPoly {
Index: src/GenPoly/Lvalue.h
===================================================================
--- src/GenPoly/Lvalue.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Lvalue.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,7 +16,8 @@
 #pragma once
 
-#include <list>
+#include <list>  // for list
 
-#include "SynTree/SynTree.h"
+class Declaration;
+class Expression;
 
 namespace GenPoly {
Index: src/GenPoly/PolyMutator.cc
===================================================================
--- src/GenPoly/PolyMutator.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/PolyMutator.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -15,10 +15,15 @@
 
 #include "PolyMutator.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Mutator.h"
-#include "SynTree/Initializer.h"
+
+#include "Common/SemanticError.h"  // for SemanticError
+#include "Common/utility.h"        // for ValueGuard
+#include "SynTree/Declaration.h"   // for Declaration, TypeDecl, TypeDecl::Data
+#include "SynTree/Expression.h"    // for Expression, UntypedExpr, StmtExpr ...
+#include "SynTree/Initializer.h"   // for SingleInit, Initializer (ptr only)
+#include "SynTree/Label.h"         // for Label, noLabels
+#include "SynTree/Mutator.h"       // for maybeMutate, mutateAll
+#include "SynTree/Statement.h"     // for CatchStmt, CompoundStmt, ForStmt
+
+class TypeSubstitution;
 
 namespace GenPoly {
Index: src/GenPoly/PolyMutator.h
===================================================================
--- src/GenPoly/PolyMutator.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/PolyMutator.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,13 +16,9 @@
 #pragma once
 
-#include <map>
-#include <string>
-#include <list>
+#include <list>               // for list
 
-#include "GenPoly.h"
-
-#include "SynTree/SynTree.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Mutator.h"
+#include "GenPoly.h"          // for TyVarMap
+#include "SynTree/Mutator.h"  // for Mutator
+#include "SynTree/SynTree.h"  // for Visitor Nodes
 
 namespace GenPoly {
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/ScrubTyVars.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,13 +14,13 @@
 //
 
-#include <sstream>
-#include <string>
+#include <utility>                      // for pair
 
-#include "GenPoly.h"
+#include "GenPoly.h"                    // for mangleType, TyVarMap, alignof...
+#include "GenPoly/ErasableScopedMap.h"  // for ErasableScopedMap<>::const_it...
 #include "ScrubTyVars.h"
-
-#include "SynTree/Mutator.h"
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
+#include "SynTree/Declaration.h"        // for TypeDecl, TypeDecl::Data, Typ...
+#include "SynTree/Expression.h"         // for Expression (ptr only), NameExpr
+#include "SynTree/Mutator.h"            // for Mutator
+#include "SynTree/Type.h"               // for PointerType, TypeInstType, Type
 
 namespace GenPoly {
Index: src/GenPoly/ScrubTyVars.h
===================================================================
--- src/GenPoly/ScrubTyVars.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/ScrubTyVars.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,10 +16,13 @@
 #pragma once
 
-#include <string>
+#include <assert.h>           // for assert
 
-#include "GenPoly.h"
+#include "GenPoly.h"          // for TyVarMap, isPolyType, isDynType
+#include "SynTree/Mutator.h"  // for Mutator
+#include "SynTree/Type.h"     // for Type (ptr only), PointerType (ptr only)
 
-#include "SynTree/SynTree.h"
-#include "SynTree/Mutator.h"
+class AlignofExpr;
+class Expression;
+class SizeofExpr;
 
 namespace GenPoly {
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Specialize.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -14,23 +14,31 @@
 //
 
-#include <cassert>
-
+#include <cassert>                       // for assert, assertf
+#include <iterator>                      // for back_insert_iterator, back_i...
+#include <map>                           // for _Rb_tree_iterator, _Rb_tree_...
+#include <memory>                        // for unique_ptr
+#include <string>                        // for string
+#include <tuple>                         // for get
+#include <utility>                       // for pair
+
+#include "Common/SemanticError.h"        // for SemanticError
+#include "Common/UniqueName.h"           // for UniqueName
+#include "Common/utility.h"              // for group_iterate
+#include "GenPoly.h"                     // for getFunctionType
+#include "InitTweak/InitTweak.h"         // for isIntrinsicCallExpr
+#include "Parser/LinkageSpec.h"          // for C
+#include "PolyMutator.h"                 // for PolyMutator
+#include "ResolvExpr/FindOpenVars.h"     // for findOpenVars
+#include "ResolvExpr/TypeEnvironment.h"  // for OpenVarSet, AssertionSet
 #include "Specialize.h"
-#include "GenPoly.h"
-#include "PolyMutator.h"
-
-#include "Parser/ParseNode.h"
-
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Type.h"
-#include "SynTree/Attribute.h"
-#include "SynTree/TypeSubstitution.h"
-#include "SynTree/Mutator.h"
-#include "ResolvExpr/FindOpenVars.h"
-#include "Common/UniqueName.h"
-#include "Common/utility.h"
-#include "InitTweak/InitTweak.h"
-#include "Tuples/Tuples.h"
+#include "SynTree/Attribute.h"           // for Attribute
+#include "SynTree/Declaration.h"         // for FunctionDecl, DeclarationWit...
+#include "SynTree/Expression.h"          // for ApplicationExpr, Expression
+#include "SynTree/Label.h"               // for Label, noLabels
+#include "SynTree/Mutator.h"             // for mutateAll
+#include "SynTree/Statement.h"           // for CompoundStmt, DeclStmt, Expr...
+#include "SynTree/Type.h"                // for FunctionType, TupleType, Type
+#include "SynTree/TypeSubstitution.h"    // for TypeSubstitution
+#include "SynTree/Visitor.h"             // for Visitor
 
 namespace GenPoly {
Index: src/GenPoly/Specialize.h
===================================================================
--- src/GenPoly/Specialize.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/GenPoly/Specialize.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,7 +16,7 @@
 #pragma once
 
-#include <list>
+#include <list>  // for list
 
-#include "SynTree/SynTree.h"
+class Declaration;
 
 namespace GenPoly {
Index: src/Virtual/ExpandCasts.cc
===================================================================
--- src/Virtual/ExpandCasts.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/Virtual/ExpandCasts.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -15,5 +15,18 @@
 
 #include "ExpandCasts.h"
-#include "Common/PassVisitor.h"
+
+#include <cassert>                 // for assert, assertf
+#include <iterator>                // for back_inserter, inserter
+#include <map>                     // for map, _Rb_tree_iterator, map<>::ite...
+#include <string>                  // for string, allocator, operator==, ope...
+#include <utility>                 // for pair
+
+#include "Common/PassVisitor.h"    // for PassVisitor
+#include "Common/SemanticError.h"  // for SemanticError
+#include "SynTree/Declaration.h"   // for ObjectDecl, StructDecl, FunctionDecl
+#include "SynTree/Expression.h"    // for VirtualCastExpr, CastExpr, Address...
+#include "SynTree/Mutator.h"       // for mutateAll
+#include "SynTree/Type.h"          // for Type, PointerType, StructInstType
+#include "SynTree/Visitor.h"       // for acceptAll
 
 namespace Virtual {
Index: src/Virtual/ExpandCasts.h
===================================================================
--- src/Virtual/ExpandCasts.h	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/Virtual/ExpandCasts.h	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -16,6 +16,7 @@
 #pragma once
 
-#include <list>
-#include "SynTree/SynTree.h"
+#include <list>  // for list
+
+class Declaration;
 
 namespace Virtual {
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 84993ff2d0c2e9be024ccd3e382182f8a5e8c7d5)
+++ src/main.cc	(revision 08fc48f4a5c70b7f3e402da3afef2763f754ff3a)
@@ -15,17 +15,16 @@
 //
 
-#include <cassert>                          // for assertf
 #include <cxxabi.h>                         // for __cxa_demangle
 #include <execinfo.h>                       // for backtrace, backtrace_symbols
 #include <getopt.h>                         // for no_argument, optind, geto...
 #include <signal.h>                         // for signal, SIGABRT, SIGSEGV
+#include <cassert>                          // for assertf
 #include <cstdio>                           // for fopen, FILE, fclose, stdin
 #include <cstdlib>                          // for exit, free, abort, EXIT_F...
 #include <cstring>                          // for index
-#include <fstream>                          // for ofstream
 #include <iostream>                         // for operator<<, basic_ostream
 #include <iterator>                         // for back_inserter
 #include <list>                             // for list
-#include <string>                           // for operator<<, allocator
+#include <string>                           // for char_traits, operator<<
 
 #include "../config.h"                      // for CFA_LIBDIR
