Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 21f0aa833ab7b8f310f78ff014b4dd33de1d0e02)
+++ src/Common/PassVisitor.h	(revision 8135d4c79504a6c3047246007261186efa5ba4c9)
@@ -116,4 +116,5 @@
 	virtual void visit( PointerType *pointerType ) override final;
 	virtual void visit( ArrayType *arrayType ) override final;
+	virtual void visit( ReferenceType *referenceType ) override final;
 	virtual void visit( FunctionType *functionType ) override final;
 	virtual void visit( StructInstType *aggregateUseType ) override final;
@@ -202,4 +203,5 @@
 	virtual Type* mutate( PointerType *pointerType ) override final;
 	virtual Type* mutate( ArrayType *arrayType ) override final;
+	virtual Type* mutate( ReferenceType *referenceType ) override final;
 	virtual Type* mutate( FunctionType *functionType ) override final;
 	virtual Type* mutate( StructInstType *aggregateUseType ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 21f0aa833ab7b8f310f78ff014b4dd33de1d0e02)
+++ src/Common/PassVisitor.impl.h	(revision 8135d4c79504a6c3047246007261186efa5ba4c9)
@@ -792,4 +792,9 @@
 
 template< typename pass_type >
+void PassVisitor< pass_type >::visit( ReferenceType * node ) {
+	VISIT_BODY( node );
+}
+
+template< typename pass_type >
 void PassVisitor< pass_type >::visit( FunctionType * node ) {
 	VISIT_BODY( node );
@@ -1129,4 +1134,9 @@
 
 template< typename pass_type >
+Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) {
+	MUTATE_BODY( Type, node );
+}
+
+template< typename pass_type >
 Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
 	MUTATE_BODY( Type, node );
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 21f0aa833ab7b8f310f78ff014b4dd33de1d0e02)
+++ src/Common/utility.h	(revision 8135d4c79504a6c3047246007261186efa5ba4c9)
@@ -310,6 +310,6 @@
 template< typename T1, typename T2 >
 struct group_iterate_t {
-	group_iterate_t( const T1 & v1, const T2 & v2 ) : args(v1, v2) {
-		assertf(v1.size() == v2.size(), "group iteration requires containers of the same size.");
+	group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
+		assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%lu, %lu>.", v1.size(), v2.size());
 	};
 
@@ -336,7 +336,14 @@
 };
 
+/// performs bounds check to ensure that all arguments are of the same length.
 template< typename... Args >
 group_iterate_t<Args...> group_iterate( Args &&... args ) {
-	return group_iterate_t<Args...>(std::forward<Args>( args )...);
+	return group_iterate_t<Args...>(false, std::forward<Args>( args )...);
+}
+
+/// does not perform a bounds check - requires user to ensure that iteration terminates when appropriate.
+template< typename... Args >
+group_iterate_t<Args...> unsafe_group_iterate( Args &&... args ) {
+	return group_iterate_t<Args...>(true, std::forward<Args>( args )...);
 }
 
