Index: src/CodeGen/CodeGenerator.cpp
===================================================================
--- src/CodeGen/CodeGenerator.cpp	(revision 59fdd0de780eab56cd0f2f21305b98edafad1b1b)
+++ src/CodeGen/CodeGenerator.cpp	(revision 1ee74df6749176dd405cc6c28df1405beb491b8a)
@@ -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 1ee74df6749176dd405cc6c28df1405beb491b8a)
@@ -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 1ee74df6749176dd405cc6c28df1405beb491b8a)
@@ -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,
