unique index for maintaining dependencies

diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c
index 22cd367..cce1b7e 100644
--- a/libasn1fix/asn1fix.c
+++ b/libasn1fix/asn1fix.c
@@ -14,6 +14,7 @@
 static int asn1f_resolve_constraints(arg_t *arg); /* For subtype constraints */
 static int asn1f_check_constraints(arg_t *arg);	/* For subtype constraints */
 static int asn1f_check_duplicate(arg_t *arg);
+static int asn1f_apply_unique_index(arg_t *arg);
 
 arg_t a1f_replace_me_with_proper_interface_arg;
 
@@ -274,6 +275,13 @@
 		ret = asn1f_recurse_expr(arg, asn1f_check_constraints);
 		RET2RVAL(ret, rvalue);
 
+		/*
+		 * Uniquely tag each inner type.
+		 */
+		asn1f_apply_unique_index(0);
+		ret = asn1f_recurse_expr(arg, asn1f_apply_unique_index);
+		RET2RVAL(ret, rvalue);
+
 		assert(arg->expr == expr);
 	}
 
@@ -429,6 +437,25 @@
 	return 0;
 }
 
+static int
+asn1f_apply_unique_index(arg_t *arg) {
+	static int unique_index;
+	if(!arg) { unique_index = 0; return 0; }
+
+	switch(arg->expr->expr_type) {
+	case ASN_BASIC_ENUMERATED:
+		break;
+	default:
+		if(arg->expr->expr_type & ASN_CONSTR_MASK)
+			break;
+		return 0;
+	}
+
+	arg->expr->_type_unique_index = ++unique_index;
+
+	return 0;
+}
+
 /*
  * Print everything to stderr
  */