identifier name clash
diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c
index f8adc75..e2f2434 100644
--- a/libasn1fix/asn1fix_bitstring.c
+++ b/libasn1fix/asn1fix_bitstring.c
@@ -36,17 +36,28 @@
asn1f_fix_bit_string_type(arg_t *arg) {
asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *v;
+ int r_value = 0;
+ 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 ",
+ v->_lineno);
+ return -1;
+ }
if(v->expr_type != A1TC_UNIVERVAL) {
FATAL("BIT STRING value at line %d "
- "is not an identifier",
- v->_lineno);
+ "is not an identifier", v->_lineno);
return -1;
}
}
- return 0;
+ return r_value;
}
static int
diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c
index ce2fc2f..cf03914 100644
--- a/libasn1fix/asn1fix_enum.c
+++ b/libasn1fix/asn1fix_enum.c
@@ -34,8 +34,7 @@
*/
if(ev->expr_type == A1TC_EXTENSIBLE) {
if(ext_marker) {
- arg->eh(1,
- "Enumeration %s at line %d: "
+ FATAL("Enumeration %s at line %d: "
"Second extension marker is not allowed",
expr->Identifier,
ev->_lineno);
diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c
index 8a14491..0302acd 100644
--- a/libasn1fix/asn1fix_integer.c
+++ b/libasn1fix/asn1fix_integer.c
@@ -38,20 +38,17 @@
* Found "...", check correctness.
*/
if(iv->expr_type == A1TC_EXTENSIBLE) {
- arg->eh(1,
- "INTEGER %s at line %d: "
+ FATAL("INTEGER %s at line %d: "
"Extension marker is not allowed",
expr->Identifier,
- iv->_lineno
- );
+ iv->_lineno);
rvalue = -1;
continue;
}
if(iv->Identifier == NULL
|| iv->expr_type != A1TC_UNIVERVAL) {
- arg->eh(1,
- "INTEGER %s at line %d: "
+ FATAL("INTEGER %s at line %d: "
"Unsupported enumeration element %s",
expr->Identifier,
iv->_lineno,
@@ -62,8 +59,7 @@
}
if(iv->value == NULL) {
- arg->eh(1,
- "INTEGER %s at line %d: "
+ FATAL("INTEGER %s at line %d: "
"Value for the identifier %s "
"must be set explicitly",
expr->Identifier,
@@ -84,8 +80,7 @@
}
if(iv->value->type != ATV_INTEGER) {
- arg->eh(1,
- "INTEGER %s at line %d: "
+ FATAL("INTEGER %s at line %d: "
"Value for the identifier %s "
"is not compatible with INTEGER type",
expr->Identifier,
diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c
index 72317aa..9e8cc07 100644
--- a/libasn1fix/asn1fix_misc.c
+++ b/libasn1fix/asn1fix_misc.c
@@ -294,8 +294,7 @@
msg = opt_compare
?"Expressions clash"
:"Identifiers name clash";
- arg->eh(1,
- "%s: "
+ FATAL("%s: "
"\"%s\" at line %d has similar %s with "
"\"%s\" at line %d",
msg,
diff --git a/tests/113-bit-string-SE.asn1 b/tests/113-bit-string-SE.asn1
new file mode 100644
index 0000000..110e764
--- /dev/null
+++ b/tests/113-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)
+-- .113
+
+ModuleBitStringExtensibility
+ { iso org(3) dod(6) internet (1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 113 }
+ DEFINITIONS ::=
+BEGIN
+
+ T ::= BIT STRING { one(1), one(2) }
+
+END