diff --git a/src/Makefile b/src/Makefile
index 9c69124241ca1148c6152c6d49344c5029cfc0b5..cc08eee88add9b8b613b40db3940c87220ab12e6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,7 +21,8 @@ PARSERS := \
 	epsilon \
 	and \
 	not \
-	attr_bool
+	attr_bool \
+	indirect
 
 OUTPUTS := bitreader.o \
 	   hammer.o \
diff --git a/src/hammer.h b/src/hammer.h
index 62b5676610415b0a03a9546cea7b829b3477d658..37ab99561ded591e143147b5324156b52626d2c1 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -435,7 +435,7 @@ HParser *h_indirect();
  * Set the inner parser of an indirect. See comments on indirect for 
  * details.
  */
-void h_bind_indirect(HParser* indirect, HParser* inner);
+void h_bind_indirect(HParser* indirect, const HParser* inner);
 
 // Some debugging aids
 /**
diff --git a/src/parsers/indirect.c b/src/parsers/indirect.c
index 43657c3bbdfe2c04dced5b3eae1bda2fef3ab26e..758116de640ef9a179b934051d7b6421ce4e33cf 100644
--- a/src/parsers/indirect.c
+++ b/src/parsers/indirect.c
@@ -7,9 +7,9 @@ static const HParserVtable indirect_vt = {
   .parse = parse_indirect,
 };
 
-void h_bind_indirect(HParser* indirect, HParser* inner) {
+void h_bind_indirect(HParser* indirect, const HParser* inner) {
   assert_message(indirect->vtable == &indirect_vt, "You can only bind an indirect parser");
-  indirect->env = inner;
+  indirect->env = (void*)inner;
 }
 
 HParser* h_indirect() {