Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/Convert.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 09 15::37::05 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 10 22:20:10 2019
-// Update Count     : 32
+// Last Modified On : Wed Dec 11 21:39:32 2019
+// Update Count     : 33
 //
 
@@ -1223,5 +1223,5 @@
 				cv( node ),
 				node->name,
-				node->kind == ast::TypeVar::Ftype,
+				node->kind == ast::TypeDecl::Ftype,
 				get<Attribute>().acceptL( node->attributes )
 			};
@@ -1578,5 +1578,5 @@
 			{ old->storageClasses.val },
 			GET_ACCEPT_1(base, Type),
-			(ast::TypeVar::Kind)(unsigned)old->kind,
+			(ast::TypeDecl::Kind)(unsigned)old->kind,
 			old->sized,
 			GET_ACCEPT_1(init, Type)
@@ -2561,5 +2561,5 @@
 			ty = new ast::TypeInstType{
 				old->name,
-				old->isFtype ? ast::TypeVar::Ftype : ast::TypeVar::Dtype,
+				old->isFtype ? ast::TypeDecl::Ftype : ast::TypeDecl::Dtype,
 				cv( old ),
 				GET_ACCEPT_V( attributes, Attribute )
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/Decl.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 9 10:00:00 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 16:41:39 2019
-// Update Count     : 18
+// Last Modified On : Fri Dec 13 16:23:15 2019
+// Update Count     : 20
 //
 
@@ -26,5 +26,4 @@
 #include "Node.hpp"            // for readonly
 #include "Type.hpp"            // for readonly
-#include "Parser/ParseNode.h"  // for DeclarationNode
 
 namespace ast {
@@ -56,15 +55,14 @@
 
 const char * TypeDecl::typeString() const {
-	static const char * kindNames[] = { "sized object type", "sized function type", "sized tuple type" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1,
-		"typeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+	static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return sized ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
 }
 
 const char * TypeDecl::genTypeString() const {
-	static const char * kindNames[] = { "dtype", "ftype", "ttype" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+	static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return kindNames[ kind ];
 }
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/Decl.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 9 10:00:00 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 08:20:20 2019
-// Update Count     : 16
+// Last Modified On : Fri Dec 13 17:38:33 2019
+// Update Count     : 29
 //
 
@@ -20,4 +20,5 @@
 #include <unordered_map>
 #include <vector>
+#include <algorithm>
 
 #include "FunctionSpec.hpp"
@@ -27,7 +28,7 @@
 #include "ParseNode.hpp"
 #include "StorageClasses.hpp"
-#include "TypeVar.hpp"
 #include "Visitor.hpp"
-#include "Parser/ParseNode.h"  // for DeclarationNode::Aggregate
+#include "Common/utility.h"
+#include "Common/SemanticError.h"						// error_str
 
 // Must be included in *all* AST classes; should be #undef'd at the end of the file
@@ -125,5 +126,5 @@
 	std::vector< ptr<Expr> > withExprs;
 
-	FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type,
+	FunctionDecl( const CodeLocation & loc, const std::string & name, FunctionType * type,
 		CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C,
 		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {})
@@ -136,5 +137,5 @@
 	bool has_body() const { return stmts; }
 
-	const DeclWithType * accept( Visitor &v ) const override { return v.visit( this ); }
+	const DeclWithType * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
 	FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
@@ -163,6 +164,8 @@
 /// Cforall type variable: `dtype T`
 class TypeDecl final : public NamedTypeDecl {
-public:
-	TypeVar::Kind kind;
+  public:
+	enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
+
+	Kind kind;
 	bool sized;
 	ptr<Type> init;
@@ -170,23 +173,21 @@
 	/// Data extracted from a type decl
 	struct Data {
-		TypeVar::Kind kind;
+		Kind kind;
 		bool isComplete;
 
-		Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {}
+		Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
 		Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {}
-		Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {}
+		Data( Kind k, bool c ) : kind( k ), isComplete( c ) {}
 		Data( const Data & d1, const Data & d2 )
-		: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
-
-		bool operator== ( const Data & o ) const {
-			return kind == o.kind && isComplete == o.isComplete;
-		}
-		bool operator!= ( const Data & o ) const { return !(*this == o); }
+			: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
+
+		bool operator==( const Data & o ) const { return kind == o.kind && isComplete == o.isComplete; }
+		bool operator!=( const Data & o ) const { return !(*this == o); }
 	};
 
-	TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b,
-		TypeVar::Kind k, bool s, Type* i = nullptr )
-	: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ),
-	  init( i ) {}
+	TypeDecl( const CodeLocation & loc, const std::string & name, Storage::Classes storage, Type * b,
+			  Kind k, bool s, Type * i = nullptr )
+		: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == Ttype || s ),
+		init( i ) {}
 
 	const char * typeString() const override;
@@ -198,5 +199,5 @@
 
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
-private:
+  private:
 	TypeDecl * clone() const override { return new TypeDecl{ *this }; }
 	MUTATE_FRIEND
@@ -343,10 +344,10 @@
 	ptr<AsmStmt> stmt;
 
-	AsmDecl( const CodeLocation & loc, AsmStmt *stmt )
+	AsmDecl( const CodeLocation & loc, AsmStmt * stmt )
 	: Decl( loc, "", {}, {} ), stmt(stmt) {}
 
-	const AsmDecl * accept( Visitor &v ) const override { return v.visit( this ); }
-private:
-	AsmDecl *clone() const override { return new AsmDecl( *this ); }
+	const AsmDecl * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	AsmDecl * clone() const override { return new AsmDecl( *this ); }
 	MUTATE_FRIEND
 };
@@ -360,5 +361,5 @@
 	: Decl( loc, "", {}, {} ), cond( condition ), msg( msg ) {}
 
-	const StaticAssertDecl * accept( Visitor &v ) const override { return v.visit( this ); }
+	const StaticAssertDecl * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
 	StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/Print.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -1359,5 +1359,5 @@
 		preprint( node );
 		os << "instance of type " << node->name
-		   << " (" << (node->kind == ast::TypeVar::Ftype ? "" : "not ") << "function type)";
+		   << " (" << (node->kind == ast::TypeDecl::Ftype ? "" : "not ") << "function type)";
 		print( node->params );
 
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/Type.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu May 9 10:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu May 9 10:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:56:46 2019
+// Update Count     : 5
 //
 
@@ -26,5 +26,4 @@
 #include "Fwd.hpp"
 #include "Node.hpp"          // for Node, ptr, ptr_base
-#include "TypeVar.hpp"
 #include "Visitor.hpp"
 
@@ -423,10 +422,10 @@
 public:
 	readonly<TypeDecl> base;
-	TypeVar::Kind kind;
+	TypeDecl::Kind kind;
 
 	TypeInstType( const std::string& n, const TypeDecl * b, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
 	: ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
-	TypeInstType( const std::string& n, TypeVar::Kind k, CV::Qualifiers q = {},
+	TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
 	: ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {}
Index: src/AST/TypeEnvironment.cpp
===================================================================
--- src/AST/TypeEnvironment.cpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/TypeEnvironment.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Wed May 29 11:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 29 11:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:49:13 2019
+// Update Count     : 4
 //
 
@@ -240,5 +240,5 @@
 		return true;
 	} else if ( auto typeInst = dynamic_cast< const TypeInstType * >( type ) ) {
-		return typeInst->kind == TypeVar::Ftype;
+		return typeInst->kind == TypeDecl::Ftype;
 	} else return false;
 }
@@ -248,5 +248,5 @@
 	bool tyVarCompatible( const TypeDecl::Data & data, const Type * type ) {
 		switch ( data.kind ) {
-		  case TypeVar::Dtype:
+		  case TypeDecl::Dtype:
 			// to bind to an object type variable, the type must not be a function type.
 			// if the type variable is specified to be a complete type then the incoming
@@ -254,7 +254,7 @@
 			// xxx - should this also check that type is not a tuple type and that it's not a ttype?
 			return ! isFtype( type ) && ( ! data.isComplete || type->isComplete() );
-		  case TypeVar::Ftype:
+		  case TypeDecl::Ftype:
 			return isFtype( type );
-		  case TypeVar::Ttype:
+		  case TypeDecl::Ttype:
 			// ttype unifies with any tuple type
 			return dynamic_cast< const TupleType * >( type ) || Tuples::isTtype( type );
Index: src/AST/TypeEnvironment.hpp
===================================================================
--- src/AST/TypeEnvironment.hpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/TypeEnvironment.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Wed May 29 11:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 29 11:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:55:54 2019
+// Update Count     : 3
 //
 
@@ -28,5 +28,4 @@
 #include "Type.hpp"
 #include "TypeSubstitution.hpp"
-#include "TypeVar.hpp"
 #include "Common/Indenter.h"
 #include "ResolvExpr/WidenMode.h"
@@ -107,5 +106,5 @@
 	/// Singleton class constructor from substitution
 	EqvClass( const std::string & v, const Type * b )
-	: vars{ v }, bound( b ), allowWidening( false ), data( TypeVar::Dtype, false ) {}
+	: vars{ v }, bound( b ), allowWidening( false ), data( TypeDecl::Dtype, false ) {}
 
 	/// Single-var constructor (strips qualifiers from bound type)
Index: src/AST/TypeVar.hpp
===================================================================
--- src/AST/TypeVar.hpp	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ 	(revision )
@@ -1,34 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// TypeVar.hpp --
-//
-// Author           : Aaron B. Moss
-// Created On       : Wed May 15 15:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 15 15:00:00 2019
-// Update Count     : 1
-//
-
-#pragma once
-
-namespace ast {
-
-namespace TypeVar {
-
-/// type variable variants.
-/// `otype` is treated as a constrainted `dtype`
-enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
-
-}
-
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/AST/module.mk
===================================================================
--- src/AST/module.mk	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/AST/module.mk	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,7 +10,7 @@
 ## Author           : Thierry Delisle
 ## Created On       : Thu May 09 16:05:36 2019
-## Last Modified By :
-## Last Modified On :
-## Update Count     :
+## Last Modified By : Peter A. Buhr
+## Last Modified On : Sat Dec 14 07:29:10 2019
+## Update Count     : 3
 ###############################################################################
 
@@ -34,6 +34,4 @@
 	AST/TypeSubstitution.cpp
 
-
-
 SRC += $(SRC_AST)
 SRCDEMANGLE += $(SRC_AST)
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeGen/CodeGenerator.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Oct 19 19:30:38 2019
-// Update Count     : 506
+// Last Modified On : Fri Dec 13 23:13:28 2019
+// Update Count     : 508
 //
 #include "CodeGenerator.h"
@@ -23,5 +23,5 @@
 #include "InitTweak/InitTweak.h"     // for getPointerBase
 #include "OperatorTable.h"           // for OperatorInfo, operatorLookup
-#include "Parser/LinkageSpec.h"      // for Spec, Intrinsic
+#include "SynTree/LinkageSpec.h"     // for Spec, Intrinsic
 #include "SynTree/Attribute.h"       // for Attribute
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
Index: src/CodeGen/FixMain.h
===================================================================
--- src/CodeGen/FixMain.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeGen/FixMain.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Thr Jan 12 14:11:09 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:16:59 2017
-// Update Count     : 1
+// Last Modified On : Fri Dec 13 23:12:21 2019
+// Update Count     : 3
 //
 
@@ -19,5 +19,5 @@
 #include <memory>
 
-#include "Parser/LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 
 class FunctionDecl;
Index: src/CodeGen/FixNames.cc
===================================================================
--- src/CodeGen/FixNames.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeGen/FixNames.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:26:00 2017
-// Update Count     : 20
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:14 2019
+// Update Count     : 21
 //
 
@@ -22,6 +22,6 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "FixMain.h"               // for FixMain
-#include "Parser/LinkageSpec.h"    // for Cforall, isMangled
 #include "SymTab/Mangler.h"        // for Mangler
+#include "SynTree/LinkageSpec.h"   // for Cforall, isMangled
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for FunctionDecl, ObjectDecl, Declarat...
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeGen/Generate.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug 18 15:39:00 2017
-// Update Count     : 7
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:38:56 2019
+// Update Count     : 8
 //
 #include "Generate.h"
@@ -22,5 +22,5 @@
 #include "GenType.h"                 // for genPrettyType
 #include "Common/PassVisitor.h"      // for PassVisitor
-#include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
+#include "SynTree/LinkageSpec.h"     // for isBuiltin, isGeneratable
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
 #include "SynTree/Declaration.h"     // for Declaration
Index: src/CodeGen/module.mk
===================================================================
--- src/CodeGen/module.mk	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeGen/module.mk	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -11,6 +11,6 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Jun  2 11:17:02 2015
-## Update Count     : 3
+## Last Modified On : Sat Dec 14 07:29:42 2019
+## Update Count     : 4
 ###############################################################################
 
@@ -24,5 +24,4 @@
 	CodeGen/OperatorTable.cc
 
-
 SRC += $(SRC_CODEGEN) CodeGen/Generate.cc CodeGen/FixNames.cc
 SRCDEMANGLE += $(SRC_CODEGEN)
Index: src/CodeTools/DeclStats.cc
===================================================================
--- src/CodeTools/DeclStats.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/CodeTools/DeclStats.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Aaron Moss
 // Created On       : Wed Jan 31 16:40:00 2016
-// Last Modified By : Aaron Moss
-// Last Modified On : Wed Jan 31 16:40:00 2016
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:33 2019
+// Update Count     : 2
 //
 
@@ -26,5 +26,5 @@
 #include "Common/VectorMap.h"      // for VectorMap
 #include "GenPoly/GenPoly.h"       // for hasPolyBase
-#include "Parser/LinkageSpec.h"    // for ::NoOfSpecs, Spec
+#include "SynTree/LinkageSpec.h"   // for ::NoOfSpecs, Spec
 #include "SynTree/Declaration.h"   // for FunctionDecl, TypeDecl, Declaration
 #include "SynTree/Expression.h"    // for UntypedExpr, Expression
Index: src/Common/Debug.h
===================================================================
--- src/Common/Debug.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Common/Debug.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Fri Sep 1 11:09:14 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Fri Sep 1 11:09:36 2017
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:42 2019
+// Update Count     : 3
 //
 
@@ -21,5 +21,5 @@
 
 #include "CodeGen/Generate.h"
-#include "Parser/LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 #include "SynTree/Declaration.h"
 
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Concurrency/Keywords.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -11,5 +11,5 @@
 // Last Modified By :
 // Last Modified On :
-// Update Count     : 9
+// Update Count     : 10
 //
 
@@ -24,5 +24,5 @@
 #include "CodeGen/OperatorTable.h" // for isConstructor
 #include "InitTweak/InitTweak.h"   // for getPointerBase
-#include "Parser/LinkageSpec.h"    // for Cforall
+#include "SynTree/LinkageSpec.h"   // for Cforall
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Concurrency/Waitfor.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -11,5 +11,5 @@
 // Last Modified By :
 // Last Modified On :
-// Update Count     : 10
+// Update Count     : 11
 //
 
@@ -27,6 +27,6 @@
 #include "CodeGen/OperatorTable.h" // for isConstructor
 #include "InitTweak/InitTweak.h"   // for getPointerBase
-#include "Parser/LinkageSpec.h"    // for Cforall
 #include "ResolvExpr/Resolver.h"   // for findVoidExpression
+#include "SynTree/LinkageSpec.h"   // for Cforall
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/ControlStruct/ExceptTranslate.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:15:29 2019
-// Update Count     : 11
+// Last Modified On : Fri Dec 13 23:40:15 2019
+// Update Count     : 12
 //
 
@@ -24,5 +24,5 @@
 #include "Common/SemanticError.h"     // for SemanticError
 #include "Common/utility.h"           // for CodeLocation
-#include "Parser/LinkageSpec.h"       // for Cforall
+#include "SynTree/LinkageSpec.h"      // for Cforall
 #include "SynTree/Attribute.h"        // for Attribute
 #include "SynTree/Constant.h"         // for Constant
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/GenPoly/Box.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 21 15:49:59 2017
-// Update Count     : 346
+// Last Modified On : Fri Dec 13 23:40:34 2019
+// Update Count     : 347
 //
 
@@ -37,5 +37,4 @@
 #include "InitTweak/InitTweak.h"         // for getFunctionName, isAssignment
 #include "Lvalue.h"                      // for generalizedLvalue
-#include "Parser/LinkageSpec.h"          // for C, Spec, Cforall, Intrinsic
 #include "ResolvExpr/TypeEnvironment.h"  // for EqvClass
 #include "ResolvExpr/typeops.h"          // for typesCompatible
@@ -44,4 +43,5 @@
 #include "SymTab/Indexer.h"              // for Indexer
 #include "SymTab/Mangler.h"              // for Mangler
+#include "SynTree/LinkageSpec.h"         // for C, Spec, Cforall, Intrinsic
 #include "SynTree/Attribute.h"           // for Attribute
 #include "SynTree/Constant.h"            // for Constant
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/GenPoly/Lvalue.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:11:18 2017
-// Update Count     : 5
+// Last Modified On : Fri Dec 13 23:14:38 2019
+// Update Count     : 7
 //
 
@@ -17,4 +17,5 @@
 #include <string>                        // for string
 
+#include "Common/UniqueName.h"
 #include "Common/PassVisitor.h"
 #include "GenPoly.h"                     // for isPolyType
@@ -22,9 +23,9 @@
 
 #include "InitTweak/InitTweak.h"
-#include "Parser/LinkageSpec.h"          // for Spec, isBuiltin, Intrinsic
 #include "ResolvExpr/TypeEnvironment.h"  // for AssertionSet, OpenVarSet
 #include "ResolvExpr/Unify.h"            // for unify
 #include "ResolvExpr/typeops.h"
 #include "SymTab/Indexer.h"              // for Indexer
+#include "SynTree/LinkageSpec.h"         // for Spec, isBuiltin, Intrinsic
 #include "SynTree/Declaration.h"         // for Declaration, FunctionDecl
 #include "SynTree/Expression.h"          // for Expression, ConditionalExpr
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/GenPoly/Specialize.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:53:59 2017
-// Update Count     : 31
+// Last Modified On : Fri Dec 13 23:40:49 2019
+// Update Count     : 32
 //
 
@@ -27,8 +27,8 @@
 #include "GenPoly.h"                     // for getFunctionType
 #include "InitTweak/InitTweak.h"         // for isIntrinsicCallExpr
-#include "Parser/LinkageSpec.h"          // for C
 #include "ResolvExpr/FindOpenVars.h"     // for findOpenVars
 #include "ResolvExpr/TypeEnvironment.h"  // for OpenVarSet, AssertionSet
 #include "Specialize.h"
+#include "SynTree/LinkageSpec.h"         // for C
 #include "SynTree/Attribute.h"           // for Attribute
 #include "SynTree/Declaration.h"         // for FunctionDecl, DeclarationWit...
Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/InitTweak/FixGlobalInit.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 04 15:14:56 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:53:11 2017
-// Update Count     : 18
+// Last Modified On : Fri Dec 13 23:41:10 2019
+// Update Count     : 19
 //
 
@@ -23,5 +23,5 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "InitTweak.h"             // for isIntrinsicSingleArgCallStmt
-#include "Parser/LinkageSpec.h"    // for C
+#include "SynTree/LinkageSpec.h"   // for C
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Constant.h"      // for Constant
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/InitTweak/FixInit.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:15:56 2019
-// Update Count     : 76
+// Last Modified On : Fri Dec 13 23:41:27 2019
+// Update Count     : 77
 //
 #include "FixInit.h"
@@ -38,5 +38,4 @@
 #include "GenPoly/GenPoly.h"           // for getFunctionType
 #include "InitTweak.h"                 // for getFunctionName, getCallArg
-#include "Parser/LinkageSpec.h"        // for C, Spec, Cforall, isBuiltin
 #include "ResolvExpr/Resolver.h"       // for findVoidExpression
 #include "ResolvExpr/typeops.h"        // for typesCompatible
@@ -44,4 +43,5 @@
 #include "SymTab/Indexer.h"            // for Indexer
 #include "SymTab/Mangler.h"            // for Mangler
+#include "SynTree/LinkageSpec.h"       // for C, Spec, Cforall, isBuiltin
 #include "SynTree/Attribute.h"         // for Attribute
 #include "SynTree/Constant.h"          // for Constant
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/InitTweak/GenInit.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:12:36 2017
-// Update Count     : 183
+// Last Modified On : Fri Dec 13 23:15:10 2019
+// Update Count     : 184
 //
 #include "GenInit.h"
@@ -34,8 +34,8 @@
 #include "GenPoly/ScopedSet.h"         // for ScopedSet, ScopedSet<>::const_iter...
 #include "InitTweak.h"                 // for isConstExpr, InitExpander, checkIn...
-#include "Parser/LinkageSpec.h"        // for isOverridable, C
 #include "ResolvExpr/Resolver.h"
 #include "SymTab/Autogen.h"            // for genImplicitCall
 #include "SymTab/Mangler.h"            // for Mangler
+#include "SynTree/LinkageSpec.h"       // for isOverridable, C
 #include "SynTree/Declaration.h"       // for ObjectDecl, DeclarationWithType
 #include "SynTree/Expression.h"        // for VariableExpr, UntypedExpr, Address...
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/InitTweak/InitTweak.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 13 11:26:36 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 22:21:48 2019
-// Update Count     : 7
+// Last Modified On : Fri Dec 13 23:15:52 2019
+// Update Count     : 8
 //
 
@@ -33,8 +33,8 @@
 #include "GenPoly/GenPoly.h"       // for getFunctionType
 #include "InitTweak.h"
-#include "Parser/LinkageSpec.h"    // for Spec, isBuiltin, Intrinsic
 #include "ResolvExpr/typeops.h"    // for typesCompatibleIgnoreQualifiers
 #include "SymTab/Autogen.h"
 #include "SymTab/Indexer.h"        // for Indexer
+#include "SynTree/LinkageSpec.h"   // for Spec, isBuiltin, Intrinsic
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Constant.h"      // for Constant
Index: src/MakeLibCfa.cc
===================================================================
--- src/MakeLibCfa.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/MakeLibCfa.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 10:33:33 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Feb 17 21:08:09 2019
-// Update Count     : 41
+// Last Modified On : Fri Dec 13 23:41:40 2019
+// Update Count     : 42
 //
 
@@ -23,5 +23,5 @@
 #include "Common/SemanticError.h"   // for SemanticError
 #include "Common/UniqueName.h"      // for UniqueName
-#include "Parser/LinkageSpec.h"     // for Spec, Intrinsic, C
+#include "SynTree/LinkageSpec.h"    // for Spec, Intrinsic, C
 #include "SynTree/Declaration.h"    // for FunctionDecl, ObjectDecl, Declara...
 #include "SynTree/Expression.h"     // for NameExpr, UntypedExpr, VariableExpr
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Makefile.in	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -212,31 +212,31 @@
 	SymTab/Indexer.$(OBJEXT) SymTab/Mangler.$(OBJEXT) \
 	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT)
-am__objects_7 = SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
-	SynTree/BasicType.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
-	SynTree/ArrayType.$(OBJEXT) SynTree/ReferenceType.$(OBJEXT) \
-	SynTree/FunctionType.$(OBJEXT) \
-	SynTree/ReferenceToType.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
-	SynTree/TypeofType.$(OBJEXT) SynTree/AttrType.$(OBJEXT) \
-	SynTree/VarArgsType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT) \
-	SynTree/Constant.$(OBJEXT) SynTree/Expression.$(OBJEXT) \
-	SynTree/TupleExpr.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
-	SynTree/TypeExpr.$(OBJEXT) SynTree/ApplicationExpr.$(OBJEXT) \
-	SynTree/AddressExpr.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
-	SynTree/CompoundStmt.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
+am__objects_7 = SynTree/AddressExpr.$(OBJEXT) \
+	SynTree/AggregateDecl.$(OBJEXT) \
+	SynTree/ApplicationExpr.$(OBJEXT) SynTree/ArrayType.$(OBJEXT) \
+	SynTree/AttrType.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
+	SynTree/BasicType.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
+	SynTree/CompoundStmt.$(OBJEXT) SynTree/Constant.$(OBJEXT) \
+	SynTree/DeclReplacer.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
 	SynTree/Declaration.$(OBJEXT) \
 	SynTree/DeclarationWithType.$(OBJEXT) \
-	SynTree/ObjectDecl.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
-	SynTree/AggregateDecl.$(OBJEXT) \
-	SynTree/NamedTypeDecl.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
-	SynTree/Initializer.$(OBJEXT) \
-	SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
-	SynTree/DeclReplacer.$(OBJEXT)
+	SynTree/Expression.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
+	SynTree/FunctionType.$(OBJEXT) SynTree/Initializer.$(OBJEXT) \
+	SynTree/LinkageSpec.$(OBJEXT) SynTree/NamedTypeDecl.$(OBJEXT) \
+	SynTree/ObjectDecl.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
+	SynTree/ReferenceToType.$(OBJEXT) \
+	SynTree/ReferenceType.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
+	SynTree/TupleExpr.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
+	SynTree/Type.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
+	SynTree/TypeExpr.$(OBJEXT) SynTree/TypeSubstitution.$(OBJEXT) \
+	SynTree/TypeofType.$(OBJEXT) SynTree/VarArgsType.$(OBJEXT) \
+	SynTree/VoidType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT)
 am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \
 	$(am__objects_2) Concurrency/Keywords.$(OBJEXT) \
 	$(am__objects_3) $(am__objects_4) GenPoly/GenPoly.$(OBJEXT) \
 	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
-	$(am__objects_5) $(am__objects_6) SymTab/Demangle.$(OBJEXT) \
-	$(am__objects_7) Tuples/TupleAssignment.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) $(am__objects_5) \
+	$(am__objects_6) SymTab/Demangle.$(OBJEXT) $(am__objects_7) \
+	Tuples/TupleAssignment.$(OBJEXT) \
 	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
 	Tuples/Tuples.$(OBJEXT) Validate/HandleAttributes.$(OBJEXT) \
@@ -261,10 +261,10 @@
 	InitTweak/GenInit.$(OBJEXT) InitTweak/FixInit.$(OBJEXT) \
 	InitTweak/FixGlobalInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/parser.$(OBJEXT) \
-	Parser/lex.$(OBJEXT) Parser/TypedefTable.$(OBJEXT) \
-	Parser/ParseNode.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
-	Parser/ExpressionNode.$(OBJEXT) Parser/StatementNode.$(OBJEXT) \
-	Parser/InitializerNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
-	Parser/LinkageSpec.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
+	Parser/ExpressionNode.$(OBJEXT) \
+	Parser/InitializerNode.$(OBJEXT) Parser/ParseNode.$(OBJEXT) \
+	Parser/StatementNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
+	Parser/TypedefTable.$(OBJEXT) Parser/lex.$(OBJEXT) \
+	Parser/parser.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
 	$(am__objects_5) ResolvExpr/AlternativePrinter.$(OBJEXT) \
 	$(am__objects_6) $(am__objects_7) \
@@ -559,12 +559,12 @@
 	InitTweak/GenInit.cc InitTweak/FixInit.cc \
 	InitTweak/FixGlobalInit.cc InitTweak/InitTweak.cc \
-	Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
-	Parser/ParseNode.cc Parser/DeclarationNode.cc \
-	Parser/ExpressionNode.cc Parser/StatementNode.cc \
-	Parser/InitializerNode.cc Parser/TypeData.cc \
-	Parser/LinkageSpec.cc Parser/parserutility.cc \
-	$(SRC_RESOLVEXPR) ResolvExpr/AlternativePrinter.cc \
-	$(SRC_SYMTAB) $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
+	Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
+	Parser/InitializerNode.cc Parser/ParseNode.cc \
+	Parser/StatementNode.cc Parser/TypeData.cc \
+	Parser/TypedefTable.cc Parser/lex.ll Parser/parser.yy \
+	Parser/parserutility.cc $(SRC_RESOLVEXPR) \
+	ResolvExpr/AlternativePrinter.cc $(SRC_SYMTAB) $(SRC_SYNTREE) \
+	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
+	Tuples/Explode.cc Tuples/Tuples.cc \
 	Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc \
 	Virtual/ExpandCasts.cc
@@ -572,8 +572,7 @@
 	Concurrency/Keywords.cc $(SRC_COMMON) $(SRC_CONTROLSTRUCT) \
 	GenPoly/GenPoly.cc GenPoly/Lvalue.cc InitTweak/GenInit.cc \
-	InitTweak/InitTweak.cc Parser/LinkageSpec.cc $(SRC_RESOLVEXPR) \
-	$(SRC_SYMTAB) SymTab/Demangle.cc $(SRC_SYNTREE) \
-	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
-	Tuples/Explode.cc Tuples/Tuples.cc \
+	InitTweak/InitTweak.cc $(SRC_RESOLVEXPR) $(SRC_SYMTAB) \
+	SymTab/Demangle.cc $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
+	Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
 	Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc
 MAINTAINERCLEANFILES = ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
@@ -663,38 +662,39 @@
 
 SRC_SYNTREE = \
-      SynTree/Type.cc \
-      SynTree/VoidType.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/ArrayType.cc \
+      SynTree/AttrType.cc \
+      SynTree/Attribute.cc \
       SynTree/BasicType.cc \
-      SynTree/PointerType.cc \
-      SynTree/ArrayType.cc \
-      SynTree/ReferenceType.cc \
-      SynTree/FunctionType.cc \
-      SynTree/ReferenceToType.cc \
-      SynTree/TupleType.cc \
-      SynTree/TypeofType.cc \
-      SynTree/AttrType.cc \
-      SynTree/VarArgsType.cc \
-      SynTree/ZeroOneType.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/CompoundStmt.cc \
       SynTree/Constant.cc \
-      SynTree/Expression.cc \
-      SynTree/TupleExpr.cc \
-      SynTree/CommaExpr.cc \
-      SynTree/TypeExpr.cc \
-      SynTree/ApplicationExpr.cc \
-      SynTree/AddressExpr.cc \
-      SynTree/Statement.cc \
-      SynTree/CompoundStmt.cc \
+      SynTree/DeclReplacer.cc \
       SynTree/DeclStmt.cc \
       SynTree/Declaration.cc \
       SynTree/DeclarationWithType.cc \
+      SynTree/Expression.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/FunctionType.cc \
+      SynTree/Initializer.cc \
+      SynTree/LinkageSpec.cc \
+      SynTree/NamedTypeDecl.cc \
       SynTree/ObjectDecl.cc \
-      SynTree/FunctionDecl.cc \
-      SynTree/AggregateDecl.cc \
-      SynTree/NamedTypeDecl.cc \
+      SynTree/PointerType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/Statement.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/TupleType.cc \
+      SynTree/Type.cc \
       SynTree/TypeDecl.cc \
-      SynTree/Initializer.cc \
+      SynTree/TypeExpr.cc \
       SynTree/TypeSubstitution.cc \
-      SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc
+      SynTree/TypeofType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/VoidType.cc \
+      SynTree/ZeroOneType.cc
 
 
@@ -869,12 +869,4 @@
 InitTweak/InitTweak.$(OBJEXT): InitTweak/$(am__dirstamp) \
 	InitTweak/$(DEPDIR)/$(am__dirstamp)
-Parser/$(am__dirstamp):
-	@$(MKDIR_P) Parser
-	@: > Parser/$(am__dirstamp)
-Parser/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) Parser/$(DEPDIR)
-	@: > Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/$(am__dirstamp):
 	@$(MKDIR_P) ResolvExpr
@@ -957,71 +949,73 @@
 	@$(MKDIR_P) SynTree/$(DEPDIR)
 	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/LinkageSpec.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
 Tuples/$(am__dirstamp):
@@ -1140,24 +1134,30 @@
 InitTweak/FixGlobalInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
 	InitTweak/$(DEPDIR)/$(am__dirstamp)
+Parser/$(am__dirstamp):
+	@$(MKDIR_P) Parser
+	@: > Parser/$(am__dirstamp)
+Parser/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Parser/$(DEPDIR)
+	@: > Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/DeclarationNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/ExpressionNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/InitializerNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/TypeData.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
 Parser/parser.hh: Parser/parser.cc
 	@if test ! -f $@; then rm -f Parser/parser.cc; else :; fi
 	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi
 Parser/parser.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/DeclarationNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/ExpressionNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/InitializerNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/TypeData.$(OBJEXT): Parser/$(am__dirstamp) \
 	Parser/$(DEPDIR)/$(am__dirstamp)
 Parser/parserutility.$(OBJEXT): Parser/$(am__dirstamp) \
@@ -1270,5 +1270,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ExpressionNode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/InitializerNode.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/LinkageSpec.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ParseNode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/StatementNode.Po@am__quote@
@@ -1329,4 +1328,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/FunctionType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Initializer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/LinkageSpec.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/NamedTypeDecl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ObjectDecl.Po@am__quote@
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/DeclarationNode.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 07:40:14 2019
-// Update Count     : 1123
+// Last Modified On : Mon Dec 16 09:32:40 2019
+// Update Count     : 1132
 //
 
@@ -24,6 +24,6 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "Common/utility.h"        // for maybeClone, maybeBuild, CodeLocation
-#include "Parser/LinkageSpec.h"    // for Spec, linkageName, Cforall
 #include "Parser/ParseNode.h"      // for DeclarationNode, ExpressionNode
+#include "SynTree/LinkageSpec.h"   // for Spec, linkageName, Cforall
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Declaration.h"   // for TypeDecl, ObjectDecl, Declaration
@@ -47,5 +47,4 @@
 const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" };
 const char * DeclarationNode::lengthNames[] = { "short", "long", "long long", "NoLengthNames" };
-const char * DeclarationNode::typeClassNames[] = { "otype", "dtype", "ftype", "NoTypeClassNames" };
 const char * DeclarationNode::builtinTypeNames[] = { "__builtin_va_list", "__auto_type", "zero_t", "one_t", "NoBuiltinTypeNames" };
 
@@ -58,5 +57,5 @@
 
 //	variable.name = nullptr;
-	variable.tyClass = NoTypeClass;
+	variable.tyClass = TypeDecl::NUMBER_OF_KINDS;
 	variable.assertions = nullptr;
 	variable.initializer = nullptr;
@@ -312,5 +311,5 @@
 } // DeclarationNode::newFromTypeGen
 
-DeclarationNode * DeclarationNode::newTypeParam( TypeClass tc, const string * name ) {
+DeclarationNode * DeclarationNode::newTypeParam( TypeDecl::Kind tc, const string * name ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = nullptr;
@@ -670,5 +669,5 @@
 
 DeclarationNode * DeclarationNode::addAssertions( DeclarationNode * assertions ) {
-	if ( variable.tyClass != NoTypeClass ) {
+	if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
 	  	if ( variable.assertions ) {
 	  		variable.assertions->appendList( assertions );
@@ -875,5 +874,5 @@
 
 DeclarationNode * DeclarationNode::addTypeInitializer( DeclarationNode * init ) {
-	assertf( variable.tyClass != NoTypeClass, "Called addTypeInitializer on something that isn't a type variable." );
+	assertf( variable.tyClass != TypeDecl::NUMBER_OF_KINDS, "Called addTypeInitializer on something that isn't a type variable." );
 	variable.initializer = init;
 	return this;
@@ -1074,10 +1073,10 @@
 	} // if
 
-	if ( variable.tyClass != NoTypeClass ) {
+	if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
 		// otype is internally converted to dtype + otype parameters
 		static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
-		assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "DeclarationNode::build: kindMap is out of sync." );
+		static_assert( sizeof(kindMap)/sizeof(kindMap[0]) == TypeDecl::NUMBER_OF_KINDS, "DeclarationNode::build: kindMap is out of sync." );
 		assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
-		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
+		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == TypeDecl::Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
 		buildList( variable.assertions, ret->get_assertions() );
 		return ret;
Index: src/Parser/LinkageSpec.cc
===================================================================
--- src/Parser/LinkageSpec.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ 	(revision )
@@ -1,67 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// LinkageSpec.cc --
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Sat May 16 13:22:09 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Spt 12 15:59:00 2018
-// Update Count     : 26
-//
-
-#include <memory>
-#include <string>
-#include <cassert>
-using namespace std;
-
-#include "LinkageSpec.h"
-#include "Common/SemanticError.h"
-
-namespace LinkageSpec {
-
-Spec linkageUpdate( CodeLocation location, Spec old_spec, const string * cmd ) {
-	assert( cmd );
-	unique_ptr<const string> guard( cmd ); // allocated by lexer
-	if ( *cmd == "\"Cforall\"" ) {
-		old_spec.is_mangled = true;
-		return old_spec;
-	} else if ( *cmd == "\"C\"" ) {
-		old_spec.is_mangled = false;
-		return old_spec;
-	} else {
-		SemanticError( location, "Invalid linkage specifier " + *cmd );
-	} // if
-}
-
-std::string linkageName( Spec linkage ) {
-    switch ( linkage ) {
-    case Intrinsic:
-        return "intrinsic";
-    case C:
-        return "C";
-    case Cforall:
-        return "Cforall";
-    case AutoGen:
-        return "autogenerated cfa";
-    case Compiler:
-        return "compiler built-in";
-    case BuiltinCFA:
-        return "cfa built-in";
-    case BuiltinC:
-        return "c built-in";
-    default:
-        return "<unnamed linkage spec>";
-    }
-}
-
-} // LinkageSpec
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/Parser/LinkageSpec.h
===================================================================
--- src/Parser/LinkageSpec.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ 	(revision )
@@ -1,79 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// LinkageSpec.h --
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Sat May 16 13:24:28 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 10 16:02:34 2019
-// Update Count     : 18
-//
-
-#pragma once
-
-#include <string>
-
-#include "Common/CodeLocation.h"
-
-namespace LinkageSpec {
-	// All linkage specs are some combination of these flags:
-	enum { Mangle = 1 << 0, Generate = 1 << 1, Overrideable = 1 << 2, Builtin = 1 << 3, GccBuiltin = 1 << 4, NoOfSpecs = 1 << 5, };
-
-	union Spec {
-		unsigned int val;
-		struct {
-			bool is_mangled : 1;
-			bool is_generatable : 1;
-			bool is_overridable : 1;
-			bool is_builtin : 1;
-			bool is_gcc_builtin : 1;
-		};
-		constexpr Spec( unsigned int val ) : val( val ) {}
-		constexpr Spec( Spec const & other ) : val( other.val ) {}
-		constexpr Spec & operator=( const Spec & ) = default;
-		// Operators may go here.
-		// Supports == and !=
-		constexpr operator unsigned int() const { return val; }
-	};
-
-
-	Spec linkageUpdate( CodeLocation location, Spec old_spec, const std::string * cmd );
-	/* If cmd = "C" returns a Spec that is old_spec with is_mangled = false
-	 * If cmd = "Cforall" returns old_spec Spec with is_mangled = true
-	 */
-
-	std::string linkageName( Spec );
-
-	// To Update: LinkageSpec::isXyz( cur_spec ) -> cur_spec.is_xyz
-	inline bool isMangled( Spec spec ) { return spec.is_mangled; }
-	inline bool isGeneratable( Spec spec ) { return spec.is_generatable; }
-	inline bool isOverridable( Spec spec ) { return spec.is_overridable; }
-	inline bool isBuiltin( Spec spec ) { return spec.is_builtin; }
-	inline bool isGccBuiltin( Spec spec ) { return spec.is_gcc_builtin; }
-
-	// Pre-defined flag combinations:
-	// C built-in defined in prelude
-	constexpr Spec const Intrinsic = { Mangle | Generate | Overrideable | Builtin };
-	// ordinary
-	constexpr Spec const Cforall = { Mangle | Generate };
-	// not overloadable, not mangled
-	constexpr Spec const C = { Generate };
-	// built by translator (struct assignment)
-	constexpr Spec const AutoGen = { Mangle | Generate | Overrideable };
-	// gcc internal
-	constexpr Spec const Compiler = { Mangle | Builtin | GccBuiltin };
-	// mangled builtins
-	constexpr Spec const BuiltinCFA = { Mangle | Generate | Builtin };
-	// non-mangled builtins
-	constexpr Spec const BuiltinC = { Generate | Builtin };
-};
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/ParseNode.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 07:40:07 2019
-// Update Count     : 882
+// Last Modified On : Mon Dec 16 07:46:01 2019
+// Update Count     : 888
 //
 
@@ -28,5 +28,5 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "Common/utility.h"        // for maybeClone, maybeBuild
-#include "Parser/LinkageSpec.h"    // for Spec
+#include "SynTree/LinkageSpec.h"   // for Spec
 #include "SynTree/Declaration.h"   // for Aggregate
 #include "SynTree/Expression.h"    // for Expression, ConstantExpr (ptr only)
@@ -218,6 +218,4 @@
 	enum Length { Short, Long, LongLong, NoLength };
 	static const char * lengthNames[];
-	enum TypeClass { Otype, Dtype, Ftype, Ttype, NoTypeClass };
-	static const char * typeClassNames[];
 	enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };
 	static const char * builtinTypeNames[];
@@ -241,5 +239,5 @@
 	static DeclarationNode * newName( const std::string * );
 	static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
-	static DeclarationNode * newTypeParam( TypeClass, const std::string * );
+	static DeclarationNode * newTypeParam( TypeDecl::Kind, const std::string * );
 	static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
 	static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
@@ -311,5 +309,5 @@
 	struct Variable_t {
 //		const std::string * name;
-		DeclarationNode::TypeClass tyClass;
+		TypeDecl::Kind tyClass;
 		DeclarationNode * assertions;
 		DeclarationNode * initializer;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/TypeData.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 07:48:33 2019
-// Update Count     : 659
+// Last Modified On : Mon Dec 16 07:56:46 2019
+// Update Count     : 662
 //
 
@@ -489,5 +489,5 @@
 	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) {
 		TypeDecl * td = static_cast<TypeDecl *>(*i);
-		if ( n->variable.tyClass == DeclarationNode::Otype ) {
+		if ( n->variable.tyClass == TypeDecl::Otype ) {
 			// add assertion parameters to `type' tyvars in reverse order
 			// add dtor:  void ^?{}(T *)
@@ -522,46 +522,45 @@
 	switch ( td->kind ) {
 	  case TypeData::Unknown:
-			// fill in implicit int
-			return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
+		// fill in implicit int
+		return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
 	  case TypeData::Basic:
-			return buildBasicType( td );
+		return buildBasicType( td );
 	  case TypeData::Pointer:
-			return buildPointer( td );
+		return buildPointer( td );
 	  case TypeData::Array:
-			return buildArray( td );
+		return buildArray( td );
 	  case TypeData::Reference:
-			return buildReference( td );
+		return buildReference( td );
 	  case TypeData::Function:
-			return buildFunction( td );
+		return buildFunction( td );
 	  case TypeData::AggregateInst:
-			return buildAggInst( td );
+		return buildAggInst( td );
 	  case TypeData::EnumConstant:
-			// the name gets filled in later -- by SymTab::Validate
-			return new EnumInstType( buildQualifiers( td ), "" );
+		// the name gets filled in later -- by SymTab::Validate
+		return new EnumInstType( buildQualifiers( td ), "" );
 	  case TypeData::SymbolicInst:
-			return buildSymbolicInst( td );
+		return buildSymbolicInst( td );
 	  case TypeData::Tuple:
-			return buildTuple( td );
+		return buildTuple( td );
 	  case TypeData::Typeof:
 	  case TypeData::Basetypeof:
-			return buildTypeof( td );
+		return buildTypeof( td );
 	  case TypeData::Builtin:
-			if (td->builtintype == DeclarationNode::Zero) {
-				return new ZeroType( noQualifiers );
-			}
-			else if (td->builtintype == DeclarationNode::One) {
-				return new OneType( noQualifiers );
-			}
-			else {
-				return new VarArgsType( buildQualifiers( td ) );
-			}
+		switch ( td->builtintype ) {
+		  case DeclarationNode::Zero:
+			return new ZeroType( noQualifiers );
+		  case DeclarationNode::One:
+			return new OneType( noQualifiers );
+		  default:
+			return new VarArgsType( buildQualifiers( td ) );
+		} // switch
 	  case TypeData::GlobalScope:
-			return new GlobalScopeType();
-		case TypeData::Qualified:
-			return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
+		return new GlobalScopeType();
+	  case TypeData::Qualified:
+		return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
 	  case TypeData::Symbolic:
 	  case TypeData::Enum:
 	  case TypeData::Aggregate:
-			assert( false );
+		assert( false );
 	} // switch
 
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/TypeData.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 10 23:01:07 2019
-// Update Count     : 198
+// Last Modified On : Fri Dec 13 23:42:35 2019
+// Update Count     : 199
 //
 
@@ -21,5 +21,5 @@
 
 #include "ParseNode.h"           // for DeclarationNode, DeclarationNode::Ag...
-#include "Parser/LinkageSpec.h"  // for Spec
+#include "SynTree/LinkageSpec.h" // for Spec
 #include "SynTree/Type.h"        // for Type, ReferenceToType (ptr only)
 #include "SynTree/SynTree.h"     // for Visitor Nodes
Index: src/Parser/module.mk
===================================================================
--- src/Parser/module.mk	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/module.mk	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -11,6 +11,6 @@
 ## Created On       : Sat May 16 15:29:09 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Jun 28 21:58:29 2017
-## Update Count     : 104
+## Last Modified On : Sat Dec 14 07:34:47 2019
+## Update Count     : 107
 ###############################################################################
 
@@ -19,19 +19,15 @@
 AM_YFLAGS = -d -t -v
 
-SRC += Parser/parser.yy \
-       Parser/lex.ll \
-       Parser/TypedefTable.cc \
-       Parser/ParseNode.cc \
+SRC += \
        Parser/DeclarationNode.cc \
        Parser/ExpressionNode.cc \
+       Parser/InitializerNode.cc \
+       Parser/ParseNode.cc \
        Parser/StatementNode.cc \
-       Parser/InitializerNode.cc \
        Parser/TypeData.cc \
-       Parser/LinkageSpec.cc \
+       Parser/TypedefTable.cc \
+       Parser/lex.ll \
+       Parser/parser.yy \
        Parser/parserutility.cc
 
-SRCDEMANGLE += \
-	Parser/LinkageSpec.cc
-
-
 MOSTLYCLEANFILES += Parser/lex.cc Parser/parser.cc Parser/parser.hh Parser/parser.output
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Parser/parser.yy	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec 12 17:54:22 2019
-// Update Count     : 4404
+// Last Modified On : Mon Dec 16 07:45:59 2019
+// Update Count     : 4408
 //
 
@@ -55,5 +55,5 @@
 #include "TypedefTable.h"
 #include "TypeData.h"
-#include "LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 #include "Common/SemanticError.h"						// error_str
 #include "Common/utility.h"								// for maybeMoveBuild, maybeBuild, CodeLo...
@@ -238,5 +238,5 @@
 	DeclarationNode * decl;
 	AggregateDecl::Aggregate aggKey;
-	DeclarationNode::TypeClass tclass;
+	TypeDecl::Kind tclass;
 	StatementNode * sn;
 	WaitForStmt * wfs;
@@ -2437,16 +2437,16 @@
 	| type_specifier identifier_parameter_declarator
 	| assertion_list
-		{ $$ = DeclarationNode::newTypeParam( DeclarationNode::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
+		{ $$ = DeclarationNode::newTypeParam( TypeDecl::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
 	;
 
 type_class:												// CFA
 	OTYPE
-		{ $$ = DeclarationNode::Otype; }
+		{ $$ = TypeDecl::Otype; }
 	| DTYPE
-		{ $$ = DeclarationNode::Dtype; }
+		{ $$ = TypeDecl::Dtype; }
 	| FTYPE
-		{ $$ = DeclarationNode::Ftype; }
+		{ $$ = TypeDecl::Ftype; }
 	| TTYPE
-		{ $$ = DeclarationNode::Ttype; }
+		{ $$ = TypeDecl::Ttype; }
 	;
 
Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 23:41:42 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:34:53 2016
-// Update Count     : 4
+// Last Modified On : Wed Dec 11 21:43:56 2019
+// Update Count     : 6
 //
 
@@ -133,10 +133,10 @@
 			// replace known function-type-variables with pointer-to-function
 			if ( const ast::EqvClass * eqvClass = tenv.lookup( inst->name ) ) {
-				if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
+				if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
 					return new ast::PointerType{ inst };
 				}
 			} else if ( const ast::NamedTypeDecl * ntDecl = symtab.lookupType( inst->name ) ) {
 				if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( ntDecl ) ) {
-					if ( tyDecl->kind == ast::TypeVar::Ftype ) {
+					if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
 						return new ast::PointerType{ inst };
 					}
Index: src/ResolvExpr/PtrsCastable.cc
===================================================================
--- src/ResolvExpr/PtrsCastable.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/ResolvExpr/PtrsCastable.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 11:48:00 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:36:18 2016
-// Update Count     : 8
+// Last Modified On : Wed Dec 11 21:48:33 2019
+// Update Count     : 9
 //
 
@@ -176,10 +176,10 @@
 			if ( const ast::NamedTypeDecl * named = symtab.lookupType( inst->name ) ) {
 				if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( named ) ) {
-					if ( tyDecl->kind == ast::TypeVar::Ftype ) {
+					if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
 						return -1;
 					}
 				}
 			} else if ( const ast::EqvClass * eqvClass = env.lookup( inst->name ) ) {
-				if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
+				if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
 					return -1;
 				}
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/ResolvExpr/Unify.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:27:10 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Sep  4 10:00:00 2019
-// Update Count     : 44
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:43:05 2019
+// Update Count     : 46
 //
 
@@ -32,5 +32,5 @@
 #include "Common/PassVisitor.h"     // for PassVisitor
 #include "FindOpenVars.h"           // for findOpenVars
-#include "Parser/LinkageSpec.h"     // for C
+#include "SynTree/LinkageSpec.h"    // for C
 #include "SynTree/Constant.h"       // for Constant
 #include "SynTree/Declaration.h"    // for TypeDecl, TypeDecl::Data, Declarati...
@@ -781,5 +781,5 @@
 				if ( const ast::EqvClass * clz = tenv.lookup( typeInst->name ) ) {
 					// expand ttype parameter into its actual type
-					if ( clz->data.kind == ast::TypeVar::Ttype && clz->bound ) {
+					if ( clz->data.kind == ast::TypeDecl::Ttype && clz->bound ) {
 						return clz->bound;
 					}
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/Autogen.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:53:34 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:50:25 2017
-// Update Count     : 15
+// Last Modified On : Fri Dec 13 16:38:06 2019
+// Update Count     : 16
 //
 
@@ -34,4 +34,5 @@
 #include "SynTree/Expression.h"   // for NameExpr, ConstantExpr, UntypedExpr...
 #include "SynTree/Type.h"         // for Type, ArrayType, Type::Qualifiers
+#include "SynTree/Statement.h"    // for CompoundStmt, DeclStmt, ExprStmt
 
 class CompoundStmt;
Index: src/SymTab/Demangle.cc
===================================================================
--- src/SymTab/Demangle.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/Demangle.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jul 19 12:52:41 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 30 13:46:33 2019
-// Update Count     : 3
+// Last Modified On : Fri Dec 13 14:54:15 2019
+// Update Count     : 4
 //
 
@@ -366,5 +366,5 @@
 				// type variable types
 				for (size_t k = 0; k < TypeDecl::NUMBER_OF_KINDS; ++k) {
-					static const std::string typeVariableNames[] = { "DT", "FT", "TT", };
+					static const std::string typeVariableNames[] = { "DT", "OT", "FT", "TT", };
 					static_assert(
 						sizeof(typeVariableNames)/sizeof(typeVariableNames[0]) == TypeDecl::NUMBER_OF_KINDS,
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/Indexer.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:37:33 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Fri Mar  8 13:55:00 2019
-// Update Count     : 21
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:43:19 2019
+// Update Count     : 22
 //
 
@@ -31,6 +31,6 @@
 #include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
 #include "Mangler.h"               // for Mangler
-#include "Parser/LinkageSpec.h"    // for isMangled, isOverridable, Spec
 #include "ResolvExpr/typeops.h"    // for typesCompatible
+#include "SynTree/LinkageSpec.h"   // for isMangled, isOverridable, Spec
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for DeclarationWithType, FunctionDecl
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/Mangler.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:40:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 30 13:46:10 2019
-// Update Count     : 26
+// Last Modified On : Fri Dec 13 23:43:49 2019
+// Update Count     : 28
 //
 #include "Mangler.h"
@@ -26,6 +26,6 @@
 #include "Common/SemanticError.h"        // for SemanticError
 #include "Common/utility.h"              // for toString
-#include "Parser/LinkageSpec.h"          // for Spec, isOverridable, AutoGen, Int...
 #include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
+#include "SynTree/LinkageSpec.h"         // for Spec, isOverridable, AutoGen, Int...
 #include "SynTree/Declaration.h"         // for TypeDecl, DeclarationWithType
 #include "SynTree/Expression.h"          // for TypeExpr, Expression, operator<<
@@ -654,5 +654,5 @@
 			// aside from the assert false.
 			assertf(false, "Mangler_new should not visit typedecl: %s", toCString(decl));
-			assertf( decl->kind < ast::TypeVar::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
+			assertf( decl->kind < ast::TypeDecl::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
 			mangleName << Encoding::typeVariables[ decl->kind ] << ( decl->name.length() ) << decl->name;
 		}
@@ -674,11 +674,11 @@
 					for ( const ast::TypeDecl * decl : ptype->forall ) {
 						switch ( decl->kind ) {
-						case ast::TypeVar::Kind::Dtype:
+						case ast::TypeDecl::Kind::Dtype:
 							dcount++;
 							break;
-						case ast::TypeVar::Kind::Ftype:
+						case ast::TypeDecl::Kind::Ftype:
 							fcount++;
 							break;
-						case ast::TypeVar::Kind::Ttype:
+						case ast::TypeDecl::Kind::Ttype:
 							vcount++;
 							break;
Index: src/SymTab/ManglerCommon.cc
===================================================================
--- src/SymTab/ManglerCommon.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/ManglerCommon.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:44:03 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 14 17:06:37 2019
-// Update Count     : 26
+// Last Modified On : Fri Dec 13 14:54:38 2019
+// Update Count     : 28
 //
 
@@ -104,4 +104,5 @@
 			const std::string typeVariables[] = {
 				"BD", // dtype
+				"BO", // otype
 				"BF", // ftype
 				"BT", // ttype
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SymTab/Validate.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:50:04 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 10 22:22:01 2019
-// Update Count     : 362
+// Last Modified On : Fri Dec 13 23:43:34 2019
+// Update Count     : 363
 //
 
@@ -69,9 +69,9 @@
 #include "InitTweak/GenInit.h"         // for fixReturnStatements
 #include "InitTweak/InitTweak.h"       // for isCtorDtorAssign
-#include "Parser/LinkageSpec.h"        // for C
 #include "ResolvExpr/typeops.h"        // for typesCompatible
 #include "ResolvExpr/Resolver.h"       // for findSingleExpression
 #include "ResolvExpr/ResolveTypeof.h"  // for resolveTypeof
 #include "SymTab/Autogen.h"            // for SizeType
+#include "SynTree/LinkageSpec.h"       // for C
 #include "SynTree/Attribute.h"         // for noAttributes, Attribute
 #include "SynTree/Constant.h"          // for Constant
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/AggregateDecl.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 23:56:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 16:31:55 2019
-// Update Count     : 29
+// Last Modified On : Fri Dec 13 23:10:22 2019
+// Update Count     : 30
 //
 
@@ -22,5 +22,5 @@
 #include "Declaration.h"         // for AggregateDecl, TypeDecl, Declaration
 #include "Initializer.h"
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Type.h"                // for Type, Type::StorageClasses
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/Declaration.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 16:48:20 2019
-// Update Count     : 149
+// Last Modified On : Fri Dec 13 23:11:22 2019
+// Update Count     : 157
 //
 
@@ -24,5 +24,5 @@
 #include "BaseSyntaxNode.h"      // for BaseSyntaxNode
 #include "Mutator.h"             // for Mutator
-#include "Parser/LinkageSpec.h"  // for Spec, Cforall
+#include "LinkageSpec.h"         // for Spec, Cforall
 #include "SynTree.h"             // for UniqueId
 #include "SynTree/Type.h"        // for Type, Type::StorageClasses, Type::Fu...
@@ -43,9 +43,9 @@
 	bool extension = false;
 
-	Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
-	Declaration( const Declaration &other );
+	Declaration( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
+	Declaration( const Declaration & other );
 	virtual ~Declaration();
 
-	const std::string &get_name() const { return name; }
+	const std::string & get_name() const { return name; }
 	void set_name( std::string newValue ) { name = newValue; }
 
@@ -58,13 +58,13 @@
 
 	bool get_extension() const { return extension; }
-	Declaration *set_extension( bool exten ) { extension = exten; return this; }
+	Declaration * set_extension( bool exten ) { extension = exten; return this; }
 
 	void fixUniqueId( void );
-	virtual Declaration *clone() const override = 0;
+	virtual Declaration * clone() const override = 0;
 	virtual void accept( Visitor & v ) override = 0;
 	virtual void accept( Visitor & v ) const override = 0;
-	virtual Declaration *acceptMutator( Mutator &m ) override = 0;
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const = 0;
+	virtual Declaration * acceptMutator( Mutator & m ) override = 0;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override = 0;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const = 0;
 
 	UniqueId uniqueId;
@@ -80,10 +80,10 @@
 	int scopeLevel = 0;
 
-	Expression *asmName;
+	Expression * asmName;
 	std::list< Attribute * > attributes;
 	bool isDeleted = false;
 
-	DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
-	DeclarationWithType( const DeclarationWithType &other );
+	DeclarationWithType( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
+	DeclarationWithType( const DeclarationWithType & other );
 	virtual ~DeclarationWithType();
 
@@ -96,6 +96,6 @@
 	DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
 
-	Expression *get_asmName() const { return asmName; }
-	DeclarationWithType * set_asmName( Expression *newValue ) { asmName = newValue; return this; }
+	Expression * get_asmName() const { return asmName; }
+	DeclarationWithType * set_asmName( Expression * newValue ) { asmName = newValue; return this; }
 
 	std::list< Attribute * >& get_attributes() { return attributes; }
@@ -105,6 +105,6 @@
 	//void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; }
 
-	virtual DeclarationWithType *clone() const override = 0;
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override = 0;
+	virtual DeclarationWithType * clone() const override = 0;
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override = 0;
 
 	virtual Type * get_type() const = 0;
@@ -118,30 +118,30 @@
 	typedef DeclarationWithType Parent;
   public:
-	Type *type;
-	Initializer *init;
-	Expression *bitfieldWidth;
-
-	ObjectDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init,
+	Type * type;
+	Initializer * init;
+	Expression * bitfieldWidth;
+
+	ObjectDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression * bitfieldWidth, Type * type, Initializer * init,
 				const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
-	ObjectDecl( const ObjectDecl &other );
+	ObjectDecl( const ObjectDecl & other );
 	virtual ~ObjectDecl();
 
 	virtual Type * get_type() const override { return type; }
-	virtual void set_type(Type *newType) override { type = newType; }
-
-	Initializer *get_init() const { return init; }
-	void set_init( Initializer *newValue ) { init = newValue; }
-
-	Expression *get_bitfieldWidth() const { return bitfieldWidth; }
-	void set_bitfieldWidth( Expression *newValue ) { bitfieldWidth = newValue; }
+	virtual void set_type(Type * newType) override { type = newType; }
+
+	Initializer * get_init() const { return init; }
+	void set_init( Initializer * newValue ) { init = newValue; }
+
+	Expression * get_bitfieldWidth() const { return bitfieldWidth; }
+	void set_bitfieldWidth( Expression * newValue ) { bitfieldWidth = newValue; }
 
 	static ObjectDecl * newObject( const std::string & name, Type * type, Initializer * init );
 
-	virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual ObjectDecl * clone() const override { return new ObjectDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -149,11 +149,11 @@
 	typedef DeclarationWithType Parent;
   public:
-	FunctionType *type;
-	CompoundStmt *statements;
+	FunctionType * type;
+	CompoundStmt * statements;
 	std::list< Expression * > withExprs;
 
-	FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements,
+	FunctionDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType * type, CompoundStmt * statements,
 				  const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
-	FunctionDecl( const FunctionDecl &other );
+	FunctionDecl( const FunctionDecl & other );
 	virtual ~FunctionDecl();
 
@@ -162,17 +162,17 @@
 
 	FunctionType * get_functionType() const { return type; }
-	void set_functionType( FunctionType *newValue ) { type = newValue; }
-	CompoundStmt *get_statements() const { return statements; }
-	void set_statements( CompoundStmt *newValue ) { statements = newValue; }
+	void set_functionType( FunctionType * newValue ) { type = newValue; }
+	CompoundStmt * get_statements() const { return statements; }
+	void set_statements( CompoundStmt * newValue ) { statements = newValue; }
 	bool has_body() const { return NULL != statements; }
 
 	static FunctionDecl * newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements );
 
-	virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -180,22 +180,22 @@
 	typedef Declaration Parent;
   public:
-	Type *base;
-	std::list< TypeDecl* > parameters;
-	std::list< DeclarationWithType* > assertions;
-
-	NamedTypeDecl( const std::string &name, Type::StorageClasses scs, Type *type );
-	NamedTypeDecl( const NamedTypeDecl &other );
+	Type * base;
+	std::list< TypeDecl * > parameters;
+	std::list< DeclarationWithType * > assertions;
+
+	NamedTypeDecl( const std::string & name, Type::StorageClasses scs, Type * type );
+	NamedTypeDecl( const NamedTypeDecl & other );
 	virtual ~NamedTypeDecl();
 
-	Type *get_base() const { return base; }
-	void set_base( Type *newValue ) { base = newValue; }
-	std::list< TypeDecl* >& get_parameters() { return parameters; }
-	std::list< DeclarationWithType* >& get_assertions() { return assertions; }
+	Type * get_base() const { return base; }
+	void set_base( Type * newValue ) { base = newValue; }
+	std::list< TypeDecl* > & get_parameters() { return parameters; }
+	std::list< DeclarationWithType * >& get_assertions() { return assertions; }
 
 	virtual const char * typeString() const = 0;
 
-	virtual NamedTypeDecl *clone() const override = 0;
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual NamedTypeDecl * clone() const override = 0;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -203,26 +203,27 @@
 	typedef NamedTypeDecl Parent;
   public:
-	enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
-
+	enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
+
+	Kind kind;
+	bool sized;
 	Type * init;
-	bool sized;
 
 	/// Data extracted from a type decl
 	struct Data {
-		TypeDecl::Kind kind;
+		Kind kind;
 		bool isComplete;
 
-		Data() : kind( (TypeDecl::Kind)-1 ), isComplete( false ) {}
-		Data( TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
+		Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
+		Data( const TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
 		Data( Kind kind, bool isComplete ) : kind( kind ), isComplete( isComplete ) {}
-		Data( const Data& d1, const Data& d2 )
-		: kind( d1.kind ), isComplete ( d1.isComplete || d2.isComplete ) {}
-
-		bool operator==(const Data & other) const { return kind == other.kind && isComplete == other.isComplete; }
-		bool operator!=(const Data & other) const { return !(*this == other);}
+		Data( const Data & d1, const Data & d2 )
+			: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
+
+		bool operator==( const Data & other ) const { return kind == other.kind && isComplete == other.isComplete; }
+		bool operator!=( const Data & other ) const { return !(*this == other);}
 	};
 
-	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init = nullptr );
-	TypeDecl( const TypeDecl &other );
+	TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init = nullptr );
+	TypeDecl( const TypeDecl & other );
 	virtual ~TypeDecl();
 
@@ -239,11 +240,9 @@
 	virtual const char * genTypeString() const;
 
-	virtual TypeDecl *clone() const override { return new TypeDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-
-	Kind kind;
+	virtual TypeDecl * clone() const override { return new TypeDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -251,15 +250,15 @@
 	typedef NamedTypeDecl Parent;
   public:
-	TypedefDecl( const std::string &name, CodeLocation location, Type::StorageClasses scs, Type *type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
+	TypedefDecl( const std::string & name, CodeLocation location, Type::StorageClasses scs, Type * type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
 		: Parent( name, scs, type ) { set_linkage( spec ); this->location = location; }
 
-	TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
-
-	virtual const char * typeString() const override;
-
-	virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	TypedefDecl( const TypedefDecl & other ) : Parent( other ) {}
+
+	virtual const char * typeString() const override;
+
+	virtual TypedefDecl * clone() const override { return new TypedefDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 };
@@ -277,6 +276,6 @@
 	AggregateDecl * parent = nullptr;
 
-	AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
-	AggregateDecl( const AggregateDecl &other );
+	AggregateDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
+	AggregateDecl( const AggregateDecl & other );
 	virtual ~AggregateDecl();
 
@@ -290,6 +289,6 @@
 	AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }
 
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override final;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override final;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
   protected:
 	virtual const char * typeString() const = 0;
@@ -299,6 +298,6 @@
 	typedef AggregateDecl Parent;
   public:
-	StructDecl( const std::string &name, Aggregate kind = Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
-	StructDecl( const StructDecl &other ) : Parent( other ), kind( other.kind ) {}
+	StructDecl( const std::string & name, Aggregate kind = Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
+	StructDecl( const StructDecl & other ) : Parent( other ), kind( other.kind ) {}
 
 	bool is_coroutine() { return kind == Coroutine; }
@@ -306,8 +305,8 @@
 	bool is_thread() { return kind == Thread; }
 
-	virtual StructDecl *clone() const override { return new StructDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	virtual StructDecl * clone() const override { return new StructDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
 	Aggregate kind;
   private:
@@ -318,11 +317,11 @@
 	typedef AggregateDecl Parent;
   public:
-	UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
-	UnionDecl( const UnionDecl &other ) : Parent( other ) {}
-
-	virtual UnionDecl *clone() const override { return new UnionDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	UnionDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
+	UnionDecl( const UnionDecl & other ) : Parent( other ) {}
+
+	virtual UnionDecl * clone() const override { return new UnionDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 	virtual const char * typeString() const override;
@@ -332,13 +331,13 @@
 	typedef AggregateDecl Parent;
   public:
-	EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
-	EnumDecl( const EnumDecl &other ) : Parent( other ) {}
+	EnumDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
+	EnumDecl( const EnumDecl & other ) : Parent( other ) {}
 
 	bool valueOf( Declaration * enumerator, long long int & value );
 
-	virtual EnumDecl *clone() const override { return new EnumDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	virtual EnumDecl * clone() const override { return new EnumDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 	std::unordered_map< std::string, long long int > enumValues;
@@ -349,13 +348,13 @@
 	typedef AggregateDecl Parent;
   public:
-	TraitDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
+	TraitDecl( const std::string & name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
 		assertf( attributes.empty(), "attribute unsupported for traits" );
 	}
-	TraitDecl( const TraitDecl &other ) : Parent( other ) {}
-
-	virtual TraitDecl *clone() const override { return new TraitDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	TraitDecl( const TraitDecl & other ) : Parent( other ) {}
+
+	virtual TraitDecl * clone() const override { return new TraitDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 	virtual const char * typeString() const override;
@@ -381,19 +380,19 @@
 class AsmDecl : public Declaration {
   public:
-	AsmStmt *stmt;
-
-	AsmDecl( AsmStmt *stmt );
-	AsmDecl( const AsmDecl &other );
+	AsmStmt * stmt;
+
+	AsmDecl( AsmStmt * stmt );
+	AsmDecl( const AsmDecl & other );
 	virtual ~AsmDecl();
 
-	AsmStmt *get_stmt() { return stmt; }
-	void set_stmt( AsmStmt *newValue ) { stmt = newValue; }
-
-	virtual AsmDecl *clone() const override { return new AsmDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual AsmDecl *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	AsmStmt * get_stmt() { return stmt; }
+	void set_stmt( AsmStmt * newValue ) { stmt = newValue; }
+
+	virtual AsmDecl * clone() const override { return new AsmDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual AsmDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -410,7 +409,7 @@
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
 	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual StaticAssertDecl * acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual StaticAssertDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
Index: src/SynTree/DeclarationWithType.cc
===================================================================
--- src/SynTree/DeclarationWithType.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/DeclarationWithType.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:34:35 2017
-// Update Count     : 25
+// Last Modified On : Fri Dec 13 23:45:16 2019
+// Update Count     : 26
 //
 
@@ -20,6 +20,6 @@
 #include "Common/utility.h"      // for cloneAll, deleteAll, maybeClone
 #include "Declaration.h"         // for DeclarationWithType, Declaration
-#include "Parser/LinkageSpec.h"  // for Spec
-#include "SynTree/Expression.h"  // for ConstantExpr
+#include "LinkageSpec.h"         // for Spec
+#include "Expression.h"          // for ConstantExpr
 #include "Type.h"                // for Type, Type::FuncSpecifiers, Type::St...
 
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/FunctionDecl.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Dec  7 17:40:09 2019
-// Update Count     : 75
+// Last Modified On : Fri Dec 13 23:10:34 2019
+// Update Count     : 76
 //
 
@@ -24,5 +24,5 @@
 #include "Declaration.h"         // for FunctionDecl, FunctionDecl::Parent
 #include "Expression.h"
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Statement.h"           // for CompoundStmt
 #include "Type.h"                // for Type, FunctionType, Type::FuncSpecif...
Index: src/SynTree/LinkageSpec.cc
===================================================================
--- src/SynTree/LinkageSpec.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/SynTree/LinkageSpec.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -0,0 +1,67 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LinkageSpec.cc --
+//
+// Author           : Rodolfo G. Esteves
+// Created On       : Sat May 16 13:22:09 2015
+// Last Modified By : Andrew Beach
+// Last Modified On : Thr Spt 12 15:59:00 2018
+// Update Count     : 26
+//
+
+#include <memory>
+#include <string>
+#include <cassert>
+using namespace std;
+
+#include "LinkageSpec.h"
+#include "Common/SemanticError.h"
+
+namespace LinkageSpec {
+
+Spec linkageUpdate( CodeLocation location, Spec old_spec, const string * cmd ) {
+	assert( cmd );
+	unique_ptr<const string> guard( cmd ); // allocated by lexer
+	if ( *cmd == "\"Cforall\"" ) {
+		old_spec.is_mangled = true;
+		return old_spec;
+	} else if ( *cmd == "\"C\"" ) {
+		old_spec.is_mangled = false;
+		return old_spec;
+	} else {
+		SemanticError( location, "Invalid linkage specifier " + *cmd );
+	} // if
+}
+
+std::string linkageName( Spec linkage ) {
+    switch ( linkage ) {
+    case Intrinsic:
+        return "intrinsic";
+    case C:
+        return "C";
+    case Cforall:
+        return "Cforall";
+    case AutoGen:
+        return "autogenerated cfa";
+    case Compiler:
+        return "compiler built-in";
+    case BuiltinCFA:
+        return "cfa built-in";
+    case BuiltinC:
+        return "c built-in";
+    default:
+        return "<unnamed linkage spec>";
+    }
+}
+
+} // LinkageSpec
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/LinkageSpec.h
===================================================================
--- src/SynTree/LinkageSpec.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/SynTree/LinkageSpec.h	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -0,0 +1,79 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LinkageSpec.h --
+//
+// Author           : Rodolfo G. Esteves
+// Created On       : Sat May 16 13:24:28 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Jul 10 16:02:34 2019
+// Update Count     : 18
+//
+
+#pragma once
+
+#include <string>
+
+#include "Common/CodeLocation.h"
+
+namespace LinkageSpec {
+	// All linkage specs are some combination of these flags:
+	enum { Mangle = 1 << 0, Generate = 1 << 1, Overrideable = 1 << 2, Builtin = 1 << 3, GccBuiltin = 1 << 4, NoOfSpecs = 1 << 5, };
+
+	union Spec {
+		unsigned int val;
+		struct {
+			bool is_mangled : 1;
+			bool is_generatable : 1;
+			bool is_overridable : 1;
+			bool is_builtin : 1;
+			bool is_gcc_builtin : 1;
+		};
+		constexpr Spec( unsigned int val ) : val( val ) {}
+		constexpr Spec( Spec const & other ) : val( other.val ) {}
+		constexpr Spec & operator=( const Spec & ) = default;
+		// Operators may go here.
+		// Supports == and !=
+		constexpr operator unsigned int() const { return val; }
+	};
+
+
+	Spec linkageUpdate( CodeLocation location, Spec old_spec, const std::string * cmd );
+	/* If cmd = "C" returns a Spec that is old_spec with is_mangled = false
+	 * If cmd = "Cforall" returns old_spec Spec with is_mangled = true
+	 */
+
+	std::string linkageName( Spec );
+
+	// To Update: LinkageSpec::isXyz( cur_spec ) -> cur_spec.is_xyz
+	inline bool isMangled( Spec spec ) { return spec.is_mangled; }
+	inline bool isGeneratable( Spec spec ) { return spec.is_generatable; }
+	inline bool isOverridable( Spec spec ) { return spec.is_overridable; }
+	inline bool isBuiltin( Spec spec ) { return spec.is_builtin; }
+	inline bool isGccBuiltin( Spec spec ) { return spec.is_gcc_builtin; }
+
+	// Pre-defined flag combinations:
+	// C built-in defined in prelude
+	constexpr Spec const Intrinsic = { Mangle | Generate | Overrideable | Builtin };
+	// ordinary
+	constexpr Spec const Cforall = { Mangle | Generate };
+	// not overloadable, not mangled
+	constexpr Spec const C = { Generate };
+	// built by translator (struct assignment)
+	constexpr Spec const AutoGen = { Mangle | Generate | Overrideable };
+	// gcc internal
+	constexpr Spec const Compiler = { Mangle | Builtin | GccBuiltin };
+	// mangled builtins
+	constexpr Spec const BuiltinCFA = { Mangle | Generate | Builtin };
+	// non-mangled builtins
+	constexpr Spec const BuiltinC = { Generate | Builtin };
+};
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/NamedTypeDecl.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 08:26:17 2019
-// Update Count     : 15
+// Last Modified On : Fri Dec 13 23:44:24 2019
+// Update Count     : 16
 //
 
@@ -20,5 +20,5 @@
 #include "Common/utility.h"      // for printAll, cloneAll, deleteAll, maybe...
 #include "Declaration.h"         // for NamedTypeDecl, DeclarationWithType
-#include "Parser/LinkageSpec.h"  // for Spec, Cforall, linkageName
+#include "LinkageSpec.h"         // for Spec, Cforall, linkageName
 #include "Type.h"                // for Type, Type::StorageClasses
 
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/ObjectDecl.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:34:27 2017
-// Update Count     : 59
+// Last Modified On : Fri Dec 13 23:44:50 2019
+// Update Count     : 60
 //
 
@@ -23,5 +23,5 @@
 #include "Expression.h"          // for Expression
 #include "Initializer.h"         // for Initializer
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Type.h"                // for Type, Type::StorageClasses, Type::Fu...
 
Index: src/SynTree/TupleType.cc
===================================================================
--- src/SynTree/TupleType.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/TupleType.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb  1 17:10:58 2017
-// Update Count     : 3
+// Last Modified On : Fri Dec 13 23:44:38 2019
+// Update Count     : 4
 //
 
@@ -20,5 +20,5 @@
 #include "Declaration.h"         // for Declaration, ObjectDecl
 #include "Initializer.h"         // for ListInit
-#include "Parser/LinkageSpec.h"  // for Cforall
+#include "LinkageSpec.h"         // for Cforall
 #include "Type.h"                // for TupleType, Type, Type::Qualifiers
 
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/TypeDecl.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 17:56:30 2019
-// Update Count     : 10
+// Last Modified On : Fri Dec 13 15:26:14 2019
+// Update Count     : 21
 //
 
@@ -18,43 +18,41 @@
 
 #include "Common/utility.h"  // for maybeClone
-#include "Parser/ParseNode.h"
 #include "Declaration.h"     // for TypeDecl, TypeDecl::Data, TypeDecl::Kind...
 #include "Type.h"            // for Type, Type::StorageClasses
 
-TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Ttype || sized ), kind( kind ) {
+TypeDecl::TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), kind( kind ), sized( kind == Ttype || sized ), init( init ) {
 }
 
-TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), init( maybeClone( other.init ) ), sized( other.sized ), kind( other.kind ) {
+TypeDecl::TypeDecl( const TypeDecl & other ) : Parent( other ), kind( other.kind ), sized( other.sized ), init( maybeClone( other.init ) ) {
 }
 
 TypeDecl::~TypeDecl() {
-  delete init;
+	delete init;
 }
 
 const char * TypeDecl::typeString() const {
-	static const char * kindNames[] = { "sized object type", "sized function type", "sized tuple type" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "typeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+	static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return isComplete() ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
 }
 
 const char * TypeDecl::genTypeString() const {
-	static const char * kindNames[] = { "dtype", "ftype", "ttype" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+	static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return kindNames[ kind ];
 }
 
 void TypeDecl::print( std::ostream &os, Indenter indent ) const {
-  NamedTypeDecl::print( os, indent );
-  if ( init ) {
-    os << std::endl << indent << "with type initializer: ";
-    init->print( os, indent + 1 );
-  }
+	NamedTypeDecl::print( os, indent );
+	if ( init ) {
+		os << std::endl << indent << "with type initializer: ";
+		init->print( os, indent + 1 );
+	} // if
 }
 
-
 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ) {
-  return os << data.kind << ", " << data.isComplete;
+	return os << data.kind << ", " << data.isComplete;
 }
 
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/SynTree/module.mk	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -11,43 +11,44 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jun  1 17:54:09 2015
-## Update Count     : 1
+## Last Modified On : Sat Dec 14 07:26:43 2019
+## Update Count     : 2
 ###############################################################################
 
 SRC_SYNTREE = \
-      SynTree/Type.cc \
-      SynTree/VoidType.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/ArrayType.cc \
+      SynTree/AttrType.cc \
+      SynTree/Attribute.cc \
       SynTree/BasicType.cc \
-      SynTree/PointerType.cc \
-      SynTree/ArrayType.cc \
-      SynTree/ReferenceType.cc \
-      SynTree/FunctionType.cc \
-      SynTree/ReferenceToType.cc \
-      SynTree/TupleType.cc \
-      SynTree/TypeofType.cc \
-      SynTree/AttrType.cc \
-      SynTree/VarArgsType.cc \
-      SynTree/ZeroOneType.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/CompoundStmt.cc \
       SynTree/Constant.cc \
-      SynTree/Expression.cc \
-      SynTree/TupleExpr.cc \
-      SynTree/CommaExpr.cc \
-      SynTree/TypeExpr.cc \
-      SynTree/ApplicationExpr.cc \
-      SynTree/AddressExpr.cc \
-      SynTree/Statement.cc \
-      SynTree/CompoundStmt.cc \
+      SynTree/DeclReplacer.cc \
       SynTree/DeclStmt.cc \
       SynTree/Declaration.cc \
       SynTree/DeclarationWithType.cc \
+      SynTree/Expression.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/FunctionType.cc \
+      SynTree/Initializer.cc \
+      SynTree/LinkageSpec.cc \
+      SynTree/NamedTypeDecl.cc \
       SynTree/ObjectDecl.cc \
-      SynTree/FunctionDecl.cc \
-      SynTree/AggregateDecl.cc \
-      SynTree/NamedTypeDecl.cc \
+      SynTree/PointerType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/Statement.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/TupleType.cc \
+      SynTree/Type.cc \
       SynTree/TypeDecl.cc \
-      SynTree/Initializer.cc \
+      SynTree/TypeExpr.cc \
       SynTree/TypeSubstitution.cc \
-      SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc
+      SynTree/TypeofType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/VoidType.cc \
+      SynTree/ZeroOneType.cc
 
 SRC += $(SRC_SYNTREE)
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Tuples/TupleAssignment.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:43:03 2017
-// Update Count     : 8
+// Last Modified On : Fri Dec 13 23:45:33 2019
+// Update Count     : 9
 //
 
@@ -34,5 +34,4 @@
 #include "InitTweak/GenInit.h"             // for genCtorInit
 #include "InitTweak/InitTweak.h"           // for getPointerBase, isAssignment
-#include "Parser/LinkageSpec.h"            // for Cforall
 #include "ResolvExpr/Alternative.h"        // for AltList, Alternative
 #include "ResolvExpr/AlternativeFinder.h"  // for AlternativeFinder, simpleC...
@@ -41,4 +40,5 @@
 #include "ResolvExpr/TypeEnvironment.h"    // for TypeEnvironment
 #include "ResolvExpr/typeops.h"            // for combos
+#include "SynTree/LinkageSpec.h"           // for Cforall
 #include "SynTree/Declaration.h"           // for ObjectDecl
 #include "SynTree/Expression.h"            // for Expression, CastExpr, Name...
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision ab5c000833007367c4829a5114587679dea8c613)
+++ src/Tuples/TupleExpansion.cc	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 19 14:39:00 2019
-// Update Count     : 22
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:45:51 2019
+// Update Count     : 24
 //
 
@@ -27,5 +27,5 @@
 #include "Common/utility.h"       // for CodeLocation
 #include "InitTweak/InitTweak.h"  // for getFunction
-#include "Parser/LinkageSpec.h"   // for Spec, C, Intrinsic
+#include "SynTree/LinkageSpec.h"  // for Spec, C, Intrinsic
 #include "SynTree/Constant.h"     // for Constant
 #include "SynTree/Declaration.h"  // for StructDecl, DeclarationWithType
@@ -361,5 +361,5 @@
 	const ast::TypeInstType * isTtype( const ast::Type * type ) {
 		if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( type ) ) {
-			if ( inst->base && inst->base->kind == ast::TypeVar::Ttype ) {
+			if ( inst->base && inst->base->kind == ast::TypeDecl::Ttype ) {
 				return inst;
 			}
