Index: src/CodeGen/CodeGenerator.cpp
===================================================================
--- src/CodeGen/CodeGenerator.cpp	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ src/CodeGen/CodeGenerator.cpp	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -130,4 +130,5 @@
 	// TODO: Which means the ast::Pass is just providing a default no visit?
 	visit_children = false;
+	changeState_ArgToIntrinsic(false);
 }
 
@@ -466,4 +467,5 @@
 		if ( var->var->linkage == ast::Linkage::Intrinsic &&
 				( opInfo = operatorLookup( var->var->name ) ) ) {
+			changeState_ArgToIntrinsic(true);
 			auto arg = expr->args.begin();
 			switch ( opInfo->type ) {
@@ -558,4 +560,5 @@
 	if ( auto name = expr->func.as<ast::NameExpr>() ) {
 		if ( const OperatorInfo * opInfo = operatorLookup( name->name ) ) {
+			changeState_ArgToIntrinsic(true);
 			auto arg = expr->args.begin();
 			switch ( opInfo->type ) {
@@ -743,5 +746,12 @@
 	extension( expr );
 	const OperatorInfo * opInfo;
-	if ( expr->var->linkage == ast::Linkage::Intrinsic
+	if ( visitingArgToIntrinsic
+			&& options.genC
+			&& dynamic_cast<ast::ZeroType const *>( expr->var->get_type() ) ) {
+		// int * p; p = 0;               ==>  ?=?( p, (zero_t){} );  ==>  p = 0;
+		// void f( zero_t z ) { g(z); }  ==>  g(z);                  ==>  g(z);
+		// (we are at the last '==>')
+		output << "0";
+	} else if ( expr->var->linkage == ast::Linkage::Intrinsic
 			&& ( opInfo = operatorLookup( expr->var->name ) )
 			&& opInfo->type == OT_CONSTANT ) {
Index: src/CodeGen/CodeGenerator.hpp
===================================================================
--- src/CodeGen/CodeGenerator.hpp	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ src/CodeGen/CodeGenerator.hpp	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -181,4 +181,11 @@
 	void handleTypedef( ast::NamedTypeDecl const * type );
 	std::string mangleName( ast::DeclWithType const * decl );
+
+	bool nextVisitedNodeIsArgToIntrinsic = false;
+	bool visitingArgToIntrinsic = false;
+	void changeState_ArgToIntrinsic( bool newValue ) {
+		GuardValue( visitingArgToIntrinsic ) = nextVisitedNodeIsArgToIntrinsic;
+		GuardValue( nextVisitedNodeIsArgToIntrinsic ) = newValue;
+	}
 };
 
Index: src/CodeGen/Generate.cpp
===================================================================
--- src/CodeGen/Generate.cpp	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ src/CodeGen/Generate.cpp	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -46,4 +46,15 @@
 		}
 	};
+
+	struct ZeroOneObjectHider final {
+		ast::ObjectDecl const * postvisit( ast::ObjectDecl const * decl ) {
+			if ( decl->type.as<ast::ZeroType>() || decl->type.as<ast::OneType>() ) {
+				ast::ObjectDecl * mutDecl = ast::mutate( decl );
+				mutDecl->attributes.push_back( new ast::Attribute( "unused" ) );
+				return mutDecl;
+			}
+			return decl;
+		}
+	};
 } // namespace
 
@@ -52,4 +63,5 @@
 	erase_if( translationUnit.decls, shouldClean );
 	ast::Pass<TreeCleaner>::run( translationUnit );
+	ast::Pass<ZeroOneObjectHider>::run( translationUnit );
 
 	ast::Pass<CodeGenerator> cgv( os,
Index: tests/.expect/zero_one-ERR1.txt
===================================================================
--- tests/.expect/zero_one-ERR1.txt	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
+++ tests/.expect/zero_one-ERR1.txt	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -0,0 +1,6 @@
+zero_one.cfa:80:1 error: Invalid application of existing declaration(s) in expression Applying untyped:
+  Name: ?=?
+...to:
+  Name: p
+  Name: o
+
Index: tests/.expect/zero_one.txt
===================================================================
--- tests/.expect/zero_one.txt	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ tests/.expect/zero_one.txt	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -3,2 +3,12 @@
 It's a Number!
 2 2
+0 0
+42 42
+0 0
+1 1
+42 42
+1 1
+zero true
+zero true
+one false
+one false
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ tests/Makefile.am	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -354,4 +354,8 @@
 	-cp ${test} ${abspath ${@}}
 
+zero_one-ERR1 : zero_one.cfa ${CFACCBIN}
+	${CFACOMPILE_SYNTAX} -DERR1
+	-cp ${test} ${abspath ${@}}
+
 ctrl-flow/loop_else : ctrl-flow/loop_else.cfa ${CFACCBIN}
 	${CC} ${AM_CFLAGS} -Wno-superfluous-else $< -o $@ 
Index: tests/zero_one.cfa
===================================================================
--- tests/zero_one.cfa	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ tests/zero_one.cfa	(revision 7959e56ee51966b45243fdf7c184c30462ae78f8)
@@ -39,7 +39,65 @@
 }
 
+void testCompats() {
+    zero_t zero = 0;
+    one_t one = 1;
+
+    int x = 0;
+	int xx = zero;
+
+	sout | x | xx;
+
+	x = xx = 42;
+	sout | x | xx;
+
+	x = 0;
+	xx = zero;
+	sout | x | xx;
+
+	int y = 1;
+	int yy = one;
+
+	sout | y | yy;
+
+	y = yy = 42;
+	sout | y | yy;
+
+	y = 1;
+	yy = one;
+	sout | y | yy;
+
+	void z_helper( int * p, zero_t z ) {
+		p = z;  // expect z not reported unused here; expect no missing cast from -Wint-conversion
+		sout | "zero" | (bool) (p == 0);
+	}
+
+	void z_call( int * p, zero_t z ) {
+		z_helper(p, z);
+	}
+
+	void o_helper( int * p, one_t o ) {
+	  #ifdef ERR1
+		p = o;
+	  #else
+		(void) x;  (void) o;
+	  #endif
+		sout | "one" | (bool) (p == 0);
+	}
+
+	void o_call( int * p, one_t o ) {
+		o_helper(p, o);
+	}
+
+	z_call( &x, 0 );
+	z_call( &x, zero );
+
+	o_call( &x, 1 );
+	o_call( &x, one );
+}
+
 int main() {
 	testOverloads();
 	testInitAssignQueryIncrement();
+	testCompats();
 	return 0;
 }
