declashing

diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c
index 0511868..8d2317f 100644
--- a/libasn1fix/asn1fix.c
+++ b/libasn1fix/asn1fix.c
@@ -385,7 +385,7 @@
 	}
 
 	/* Check identifier distinctness */
-	ret = asn1f_check_unique_expr(arg, NULL);
+	ret = asn1f_check_unique_expr(arg);
 	RET2RVAL(ret, rvalue);
 
 	/* Fix extensibility */
diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c
index f3d5ad7..5f30ea4 100644
--- a/libasn1fix/asn1fix_bitstring.c
+++ b/libasn1fix/asn1fix_bitstring.c
@@ -32,6 +32,10 @@
 	return r_value;
 }
 
+static int _compare_value(asn1p_expr_t *expr1, asn1p_expr_t *expr2) {
+	return expr2->value->value.v_integer - expr1->value->value.v_integer;
+}
+
 static int
 asn1f_fix_bit_string_type(arg_t *arg) {
 	asn1p_expr_t *expr = arg->expr;
@@ -40,10 +44,6 @@
 	int ret;
 
 	TQ_FOR(v, &(expr->members), next) {
-		/* Check identifier uniqueness as per 21.4 */
-		ret = asn1f_check_unique_expr_child(arg, v, 0);
-		RET2RVAL(ret, r_value);
-
 		if(v->expr_type == A1TC_EXTENSIBLE) {
 			FATAL("Extension marker (...) is not allowed "
 				"as a BIT STRING NamedBit at line %d ",
@@ -74,6 +74,14 @@
 				v->_lineno);
 			return -1;
 		}
+
+		/* Check value uniqueness as per 21.4 */
+		ret = asn1f_check_unique_expr_child(arg, v,
+				_compare_value, "value");
+		RET2RVAL(ret, r_value);
+		/* Check identifier uniqueness as per 21.5 */
+		ret = asn1f_check_unique_expr_child(arg, v, 0, "identifier");
+		RET2RVAL(ret, r_value);
 	}
 
 	return r_value;
diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c
index cf03914..570d23a 100644
--- a/libasn1fix/asn1fix_enum.c
+++ b/libasn1fix/asn1fix_enum.c
@@ -119,7 +119,7 @@
 		 * 1.4 Check that all identifiers before the current one
 		 * differs from it.
 		 */
-		ret = asn1f_check_unique_expr_child(arg, ev, NULL);
+		ret = asn1f_check_unique_expr_child(arg, ev, 0, "identifier");
 		RET2RVAL(ret, rvalue);
 	}
 
diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c
index 0302acd..a5d0b6e 100644
--- a/libasn1fix/asn1fix_integer.c
+++ b/libasn1fix/asn1fix_integer.c
@@ -92,12 +92,13 @@
 		/*
 		 * Check that all identifiers are distinct.
 		 */
-		ret = asn1f_check_unique_expr_child(arg, iv, NULL);
+		ret = asn1f_check_unique_expr_child(arg, iv, 0, "identifier");
 		RET2RVAL(ret, rvalue);
 		/*
 		 * Check that all values are distinct.
 		 */
-		ret = asn1f_check_unique_expr_child(arg, iv, _compare_value);
+		ret = asn1f_check_unique_expr_child(arg, iv,
+				_compare_value, "value");
 		RET2RVAL(ret, rvalue);
 	}
 
diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c
index 9e8cc07..4af0fd8 100644
--- a/libasn1fix/asn1fix_misc.c
+++ b/libasn1fix/asn1fix_misc.c
@@ -236,15 +236,14 @@
  * Check that every child of a given expr has unique name or does not have any.
  */
 int
-asn1f_check_unique_expr(arg_t *arg,
-		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) {
+asn1f_check_unique_expr(arg_t *arg) {
 	asn1p_expr_t *expr;
 	int rvalue = 0;
 
 	TQ_FOR(expr, &(arg->expr->members), next) {
 		if(expr->Identifier) {
 			int ret = asn1f_check_unique_expr_child(arg, expr,
-				opt_compare);
+				0, "identifier");
 			if(ret) rvalue = -1;
 		} else {
 			/*
@@ -263,9 +262,11 @@
  */
 int
 asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child,
-		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) {
+		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b),
+		const char *opt_property_name) {
 	asn1p_expr_t *expr;
-	int rvalue = 0;
+
+	if(!opt_property_name) opt_property_name = "property";
 
 	assert(child);
 	assert(opt_compare || child->Identifier);
@@ -290,26 +291,20 @@
 		}
 
 		if(ret == 0) {
-			char *msg;
-			msg = opt_compare
-				?"Expressions clash"
-				:"Identifiers name clash";
-			FATAL("%s: "
+			FATAL("Clash detected: "
 				"\"%s\" at line %d has similar %s with "
 				"\"%s\" at line %d",
-				msg,
 				expr->Identifier,
 				expr->_lineno,
-				opt_compare?"property":"name",
+				opt_property_name,
 				child->Identifier,
 				child->_lineno
 			);
-
-			rvalue = -1;
+			return -1;
 		}
 	}
 
-	return rvalue;
+	return 0;
 }
 
 int
diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h
index a90c5be..6dcd220 100644
--- a/libasn1fix/asn1fix_misc.h
+++ b/libasn1fix/asn1fix_misc.h
@@ -11,12 +11,9 @@
 int asn1f_recurse_expr(arg_t *arg, int (*f)(arg_t *arg));
 
 /*
- * Check that every child of a given expr has unique name or does not have any.
- * If opt_compare == NULL, the default comparison of the argument's
- * names (identifiers) will be performed.
+ * Check that every child of a given expr has unique identifier.
  */
-int asn1f_check_unique_expr(arg_t *arg,
-		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b));
+int asn1f_check_unique_expr(arg_t *arg);
 
 /*
  * Check that every preceeding child of the given expr is not
@@ -25,7 +22,8 @@
  * names (identifiers) will be performed.
  */
 int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child,
-		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b));
+		int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b),
+		const char *opt_property_name);
 
 /*
  * Return number of children.
diff --git a/tests/116-bit-string-SE.asn1 b/tests/116-bit-string-SE.asn1
new file mode 100644
index 0000000..f5967c0
--- /dev/null
+++ b/tests/116-bit-string-SE.asn1
@@ -0,0 +1,16 @@
+
+-- SE: Semantic error
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .116
+
+ModuleBitStringSameValues
+	{ iso org(3) dod(6) internet (1) private(4) enterprise(1)
+		spelio(9363) software(1) asn1c(5) test(1) 116 }
+	DEFINITIONS ::=
+BEGIN
+
+	T ::= BIT STRING { one(1), another(1) }
+
+END