Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 b6fe7e6c491f467e31d7ef488c6c0c23df6534a8)
+++ 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 \
