Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/CodeGen/GenType.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -42,4 +42,6 @@
 		virtual void visit( TypeInstType *typeInst );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
 
 	  private:
@@ -200,4 +202,16 @@
 	}
 
+	void GenType::visit( ZeroType *zeroType ) {
+		// ideally these wouldn't hit codegen at all, but should be safe to make them ints
+		typeString = "int " + typeString;
+		handleQualifiers( zeroType );
+	}
+
+	void GenType::visit( OneType *oneType ) {
+		// ideally these wouldn't hit codegen at all, but should be safe to make them ints
+		typeString = "int " + typeString;
+		handleQualifiers( oneType );
+	}
+
 	void GenType::handleQualifiers( Type *type ) {
 		if ( type->get_isConst() ) {
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/Makefile.in	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -165,4 +165,5 @@
 	SynTree/driver_cfa_cpp-AttrType.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT) \
+	SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Constant.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Expression.$(OBJEXT) \
@@ -390,6 +391,6 @@
 	SynTree/ReferenceToType.cc SynTree/TupleType.cc \
 	SynTree/TypeofType.cc SynTree/AttrType.cc \
-	SynTree/VarArgsType.cc SynTree/Constant.cc \
-	SynTree/Expression.cc SynTree/TupleExpr.cc \
+	SynTree/VarArgsType.cc SynTree/ZeroOneType.cc \
+	SynTree/Constant.cc SynTree/Expression.cc SynTree/TupleExpr.cc \
 	SynTree/CommaExpr.cc SynTree/TypeExpr.cc \
 	SynTree/ApplicationExpr.cc SynTree/AddressExpr.cc \
@@ -715,4 +716,6 @@
 SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/driver_cfa_cpp-Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
@@ -877,4 +880,5 @@
 	-rm -f SynTree/driver_cfa_cpp-Visitor.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT)
+	-rm -f SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT)
 	-rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)
 	-rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT)
@@ -982,4 +986,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-Visitor.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@
@@ -2064,4 +2069,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-VarArgsType.obj `if test -f 'SynTree/VarArgsType.cc'; then $(CYGPATH_W) 'SynTree/VarArgsType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/VarArgsType.cc'; fi`
+
+SynTree/driver_cfa_cpp-ZeroOneType.o: SynTree/ZeroOneType.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-ZeroOneType.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Tpo -c -o SynTree/driver_cfa_cpp-ZeroOneType.o `test -f 'SynTree/ZeroOneType.cc' || echo '$(srcdir)/'`SynTree/ZeroOneType.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SynTree/ZeroOneType.cc' object='SynTree/driver_cfa_cpp-ZeroOneType.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-ZeroOneType.o `test -f 'SynTree/ZeroOneType.cc' || echo '$(srcdir)/'`SynTree/ZeroOneType.cc
+
+SynTree/driver_cfa_cpp-ZeroOneType.obj: SynTree/ZeroOneType.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-ZeroOneType.obj -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Tpo -c -o SynTree/driver_cfa_cpp-ZeroOneType.obj `if test -f 'SynTree/ZeroOneType.cc'; then $(CYGPATH_W) 'SynTree/ZeroOneType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/ZeroOneType.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SynTree/ZeroOneType.cc' object='SynTree/driver_cfa_cpp-ZeroOneType.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-ZeroOneType.obj `if test -f 'SynTree/ZeroOneType.cc'; then $(CYGPATH_W) 'SynTree/ZeroOneType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/ZeroOneType.cc'; fi`
 
 SynTree/driver_cfa_cpp-Constant.o: SynTree/Constant.cc
Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -37,4 +37,6 @@
 		virtual Type* mutate( TupleType *tupleType );
 		virtual Type* mutate( VarArgsType *varArgsType );
+		virtual Type* mutate( ZeroType *zeroType );
+		virtual Type* mutate( OneType *oneType );
 
 		const TypeEnvironment &env;
@@ -117,4 +119,12 @@
 		return varArgsType;
 	}
+
+	Type *AdjustExprType::mutate( ZeroType *zeroType ) {
+		return zeroType;
+	}
+
+	Type *AdjustExprType::mutate( OneType *oneType ) {
+		return oneType;
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/CommonType.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -39,4 +39,6 @@
 		virtual void visit( TupleType *tupleType );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
 
 		template< typename RefType > void handleRefType( RefType *inst, Type *other );
@@ -134,9 +136,9 @@
 				result = new BasicType( basicType->get_qualifiers() + otherBasic->get_qualifiers(), newType );
 			} // if
-		} else if ( EnumInstType *enumInstType = dynamic_cast< EnumInstType * > ( type2 ) ) {
-			// use signed int in lieu of the enum type
+		} else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {
+			// use signed int in lieu of the enum/zero/one type
 			BasicType::Kind newType = combinedType[ basicType->get_kind() ][ BasicType::SignedInt ];
-			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= enumInstType->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= enumInstType->get_qualifiers() ) || widenSecond ) ) {
-				result = new BasicType( basicType->get_qualifiers() + enumInstType->get_qualifiers(), newType );
+			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) {
+				result = new BasicType( basicType->get_qualifiers() + type2->get_qualifiers(), newType );
 			} // if
 		} // if
@@ -171,4 +173,7 @@
 				otherPointer->get_base()->get_qualifiers() = tq2;
 			} // if
+		} else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) {
+			result = pointerType->clone();
+			result->get_qualifiers() += type2->get_qualifiers();
 		} // if
 	}
@@ -190,5 +195,5 @@
 
 	void CommonType::visit( EnumInstType *enumInstType ) {
-		if ( dynamic_cast< BasicType * >( type2 ) ) {
+		if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {
 			// reuse BasicType, EnumInstType code by swapping type2 with enumInstType
 			Type * temp = type2;
@@ -230,4 +235,26 @@
 	void CommonType::visit( VarArgsType *varArgsType ) {
 	}
+
+	void CommonType::visit( ZeroType *zeroType ) {
+		if ( widenFirst ) {
+			if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< PointerType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) {
+				if ( widenSecond || zeroType->get_qualifiers() <= type2->get_qualifiers() ) {
+					result = type2->clone();
+					result->get_qualifiers() += zeroType->get_qualifiers();
+				}
+			}
+		}
+	}
+
+	void CommonType::visit( OneType *oneType ) {
+		if ( widenFirst ) {
+			if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) {
+				if ( widenSecond || oneType->get_qualifiers() <= type2->get_qualifiers() ) {
+					result = type2->clone();
+					result->get_qualifiers() += oneType->get_qualifiers();
+				}
+			}
+		}
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/ConversionCost.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -160,5 +160,7 @@
 			// xxx - not positive this is correct, but appears to allow casting int => enum
 			cost = Cost( 1, 0, 0 );
-    } // if
+		} else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) {
+			cost = Cost( 1, 0, 0 );
+		} // if
 	}
 
@@ -175,4 +177,6 @@
 				} // if
 			} // if
+		} else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) {
+			cost = Cost( 1, 0, 0 );
 		} // if
 	}
@@ -256,4 +260,34 @@
 		}
 	}
+
+	void ConversionCost::visit(ZeroType *zeroType) {
+		if ( dynamic_cast< ZeroType* >( dest ) ) {
+			cost = Cost::zero;
+		} else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {
+			// copied from visit(BasicType*) for signed int, but +1 for safe conversions
+			int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ];
+			if ( tableResult == -1 ) {
+				cost = Cost( 1, 0, 0 );
+			} else {
+				cost = Cost( 0, 0, tableResult + 1 );
+			}
+		} else if ( dynamic_cast< PointerType* >( dest ) ) {
+			cost = Cost( 0, 0, 1 );
+		}
+	}
+
+	void ConversionCost::visit(OneType *oneType) {
+		if ( dynamic_cast< OneType* >( dest ) ) {
+			cost = Cost::zero;
+		} else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {
+			// copied from visit(BasicType*) for signed int, but +1 for safe conversions
+			int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ];
+			if ( tableResult == -1 ) {
+				cost = Cost( 1, 0, 0 );
+			} else {
+				cost = Cost( 0, 0, tableResult + 1 );
+			}
+		}
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/ConversionCost.h
===================================================================
--- src/ResolvExpr/ConversionCost.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/ConversionCost.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -41,4 +41,6 @@
 		virtual void visit(TupleType *tupleType);
 		virtual void visit(VarArgsType *varArgsType);
+		virtual void visit(ZeroType *zeroType);
+		virtual void visit(OneType *oneType);
 	  protected:
 		Type *dest;
Index: src/ResolvExpr/PtrsAssignable.cc
===================================================================
--- src/ResolvExpr/PtrsAssignable.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/PtrsAssignable.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -39,4 +39,6 @@
 		virtual void visit( TupleType *tupleType );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
 	  private:
 		Type *dest;
@@ -141,4 +143,11 @@
 	void PtrsAssignable::visit( VarArgsType *varArgsType ) {
 	}
+
+	void PtrsAssignable::visit( ZeroType *zeroType ) {
+	}
+	
+	void PtrsAssignable::visit( OneType *oneType ) {
+	}
+	
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/PtrsCastable.cc
===================================================================
--- src/ResolvExpr/PtrsCastable.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/PtrsCastable.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -40,4 +40,6 @@
 		virtual void visit(TupleType *tupleType);
 		virtual void visit(VarArgsType *varArgsType);
+		virtual void visit(ZeroType *zeroType);
+		virtual void visit(OneType *oneType);
 	  private:
 		Type *dest;
@@ -144,4 +146,12 @@
 		result = objectCast( dest, env, indexer );
 	}
+
+	void PtrsCastable::visit(ZeroType *zeroType) {
+		result = objectCast( dest, env, indexer );
+	}
+
+	void PtrsCastable::visit(OneType *oneType) {
+		result = objectCast( dest, env, indexer );
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/RenameVars.cc
===================================================================
--- src/ResolvExpr/RenameVars.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/RenameVars.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -110,4 +110,14 @@
 	}
 
+	void RenameVars::visit( ZeroType *zeroType ) {
+		typeBefore( zeroType );
+		typeAfter( zeroType );
+	}
+
+	void RenameVars::visit( OneType *oneType ) {
+		typeBefore( oneType );
+		typeAfter( oneType );
+	}
+
 	void RenameVars::typeBefore( Type *type ) {
 		if ( ! type->get_forall().empty() ) {
Index: src/ResolvExpr/RenameVars.h
===================================================================
--- src/ResolvExpr/RenameVars.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/RenameVars.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -44,4 +44,6 @@
 		virtual void visit( TupleType *tupleType );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
 
 		void typeBefore( Type *type );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/Resolver.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -133,4 +133,6 @@
 			} else if ( BasicType *bt = dynamic_cast< BasicType * >( type ) ) {
 				return bt->isInteger();
+			} else if ( dynamic_cast< ZeroType* >( type ) != nullptr || dynamic_cast< OneType* >( type ) != nullptr ) {
+				return true;
 			} else {
 				return false;
@@ -459,5 +461,6 @@
 			}
 		} else {
-			assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) );
+			assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext )
+			        || dynamic_cast< ZeroType * >( initContext ) || dynamic_cast< OneType * >( initContext ) );
 			// basic types are handled here
 			Visitor::visit( listInit );
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/ResolvExpr/Unify.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -60,4 +60,6 @@
 		virtual void visit(TupleType *tupleType);
 		virtual void visit(VarArgsType *varArgsType);
+		virtual void visit(ZeroType *zeroType);
+		virtual void visit(OneType *oneType);
 
 		template< typename RefType > void handleRefType( RefType *inst, Type *other );
@@ -588,4 +590,12 @@
 	}
 
+	void Unify::visit(ZeroType *zeroType) {
+		result = dynamic_cast< ZeroType* >( type2 );
+	}
+
+	void Unify::visit(OneType *oneType) {
+		result = dynamic_cast< OneType* >( type2 );
+	}
+
 } // namespace ResolvExpr
 
Index: src/SymTab/FixFunction.cc
===================================================================
--- src/SymTab/FixFunction.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/FixFunction.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -77,4 +77,12 @@
 		return varArgsType;
 	}
+
+	Type * FixFunction::mutate(ZeroType *zeroType) {
+		return zeroType;
+	}
+
+	Type * FixFunction::mutate(OneType *oneType) {
+		return oneType;
+	}
 } // namespace SymTab
 
Index: src/SymTab/FixFunction.h
===================================================================
--- src/SymTab/FixFunction.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/FixFunction.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -42,4 +42,6 @@
 		virtual Type* mutate(TupleType *tupleType);
 		virtual Type* mutate(VarArgsType *varArgsType);
+		virtual Type* mutate(ZeroType *zeroType);
+		virtual Type* mutate(OneType *oneType);
   
 		bool isVoid;
Index: src/SymTab/ImplementationType.cc
===================================================================
--- src/SymTab/ImplementationType.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/ImplementationType.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -41,4 +41,6 @@
 		virtual void visit(TupleType *tupleType);
 		virtual void visit(VarArgsType *varArgsType);
+		virtual void visit(ZeroType *zeroType);
+		virtual void visit(OneType *oneType);
 
 		Type *result;			// synthesized
@@ -120,4 +122,10 @@
 	void ImplementationType::visit(VarArgsType *varArgsType) {
 	}
+
+	void ImplementationType::visit(ZeroType *zeroType) {
+	}
+
+	void ImplementationType::visit(OneType *oneType) {
+	}
 } // namespace SymTab
 
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/Mangler.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -229,4 +229,12 @@
 		printQualifiers( varArgsType );
 		mangleName << "VARGS";
+	}
+
+	void Mangler::visit( ZeroType *zeroType ) {
+		mangleName << "Z";
+	}
+
+	void Mangler::visit( OneType *oneType ) {
+		mangleName << "O";
 	}
 
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/Mangler.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -46,4 +46,6 @@
 		virtual void visit( TupleType *tupleType );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
   
 		std::string get_mangleName() { return mangleName.str(); }
Index: src/SymTab/TypeEquality.cc
===================================================================
--- src/SymTab/TypeEquality.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SymTab/TypeEquality.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -42,4 +42,6 @@
 		virtual void visit( TypeInstType *typeInst );
 		virtual void visit( VarArgsType *varArgsType );
+		virtual void visit( ZeroType *zeroType );
+		virtual void visit( OneType *oneType );
 
 		void handleQualifiers( Type * t );
@@ -199,3 +201,17 @@
 		}
 	}
+
+	void TypeEquality::visit( ZeroType *zeroType ) {
+		handleQualifiers( zeroType );
+		if ( ! dynamic_cast< ZeroType * >( other ) ) {
+			result = false;
+		}
+	}
+
+	void TypeEquality::visit( OneType *oneType ) {
+		handleQualifiers( oneType );
+		if ( ! dynamic_cast< OneType * >( other ) ) {
+			result = false;
+		}
+	}
 } // namespace SymTab
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/Mutator.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -453,4 +453,14 @@
 }
 
+Type *Mutator::mutate( ZeroType *zeroType ) {
+	mutateAll( zeroType->get_forall(), *this );
+	return zeroType;
+}
+
+Type *Mutator::mutate( OneType *oneType ) {
+	mutateAll( oneType->get_forall(), *this );
+	return oneType;
+}
+
 Initializer *Mutator::mutate( SingleInit *singleInit ) {
 	singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/Mutator.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -95,4 +95,6 @@
 	virtual Type* mutate( AttrType *attrType );
 	virtual Type* mutate( VarArgsType *varArgsType );
+	virtual Type* mutate( ZeroType *zeroType );
+	virtual Type* mutate( OneType *oneType );
 
 	virtual Initializer* mutate( SingleInit *singleInit );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/SynTree.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -102,4 +102,6 @@
 class AttrType;
 class VarArgsType;
+class ZeroType;
+class OneType;
 
 class Initializer;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/Type.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -418,4 +418,28 @@
 };
 
+/// Represents a zero constant
+class ZeroType : public Type {
+  public:
+	ZeroType();
+	ZeroType( Type::Qualifiers tq );
+
+	virtual ZeroType *clone() const { return new ZeroType( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+};
+
+/// Represents a one constant
+class OneType : public Type {
+  public:
+	OneType();
+	OneType( Type::Qualifiers tq );
+
+	virtual OneType *clone() const { return new OneType( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+};
+
 inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
 	isConst |= other.isConst;
Index: src/SynTree/TypeSubstitution.cc
===================================================================
--- src/SynTree/TypeSubstitution.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/TypeSubstitution.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -179,6 +179,6 @@
 }
 
-Type * TypeSubstitution::mutate( VoidType *basicType ) {
-	return handleType( basicType );
+Type * TypeSubstitution::mutate( VoidType *voidType ) {
+	return handleType( voidType );
 }
 
@@ -221,4 +221,12 @@
 Type * TypeSubstitution::mutate( VarArgsType *varArgsType ) {
 	return handleType( varArgsType );
+}
+
+Type * TypeSubstitution::mutate( ZeroType *zeroType ) {
+	return handleType( zeroType );
+}
+
+Type * TypeSubstitution::mutate( OneType *oneType ) {
+	return handleType( oneType );
 }
 
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/TypeSubstitution.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -76,4 +76,6 @@
 	virtual Type* mutate(TupleType *tupleType);
 	virtual Type* mutate(VarArgsType *varArgsType);
+	virtual Type* mutate(ZeroType *zeroType);
+	virtual Type* mutate(OneType *oneType);
 
 	// TODO: worry about traversing into a forall-qualified function type or type decl with assertions
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/Visitor.cc	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -383,4 +383,12 @@
 }
 
+void Visitor::visit( ZeroType *zeroType ) {
+	acceptAll( zeroType->get_forall(), *this );
+}
+
+void Visitor::visit( OneType *oneType ) {
+	acceptAll( oneType->get_forall(), *this );
+}
+
 void Visitor::visit( SingleInit *singleInit ) {
 	singleInit->get_value()->accept( *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/Visitor.h	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -95,4 +95,6 @@
 	virtual void visit( AttrType *attrType );
 	virtual void visit( VarArgsType *varArgsType );
+	virtual void visit( ZeroType *zeroType );
+	virtual void visit( OneType *oneType );
 
 	virtual void visit( SingleInit *singleInit );
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision fc4a0fa1644cfe82d2b775fe96dcfda5a4565501)
+++ src/SynTree/module.mk	(revision 89e6ffcdff36e5cf99ff1d6c8bde150e2fb05235)
@@ -26,4 +26,5 @@
        SynTree/AttrType.cc \
        SynTree/VarArgsType.cc \
+       SynTree/ZeroOneType.cc \
        SynTree/Constant.cc \
        SynTree/Expression.cc \
