0..MAX is unsigned in constraints
diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c
index 24023f0..bd6087e 100644
--- a/libasn1compiler/asn1c_constraint.c
+++ b/libasn1compiler/asn1c_constraint.c
@@ -12,16 +12,16 @@
static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype);
static asn1p_expr_type_e _find_terminal_type(arg_t *arg);
static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1c_integer_t natural_start, asn1c_integer_t natural_stop);
-static int native_long_sign(asn1cnst_range_t *r); /* -1, 0, 1 */
+static int native_long_sign(arg_t *arg, asn1cnst_range_t *r); /* -1, 0, 1 */
static int
-ulong_optimization(asn1p_expr_type_e etype, asn1cnst_range_t *r_size,
+ulong_optimization(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_range_t *r_size,
asn1cnst_range_t *r_value)
{
return (!r_size && r_value
&& (etype == ASN_BASIC_INTEGER
|| etype == ASN_BASIC_ENUMERATED)
- && native_long_sign(r_value) == 0);
+ && native_long_sign(arg, r_value) == 0);
}
int
@@ -104,8 +104,8 @@
switch(etype) {
case ASN_BASIC_INTEGER:
case ASN_BASIC_ENUMERATED:
- if(native_long_sign(r_value) >= 0) {
- ulong_optimize = ulong_optimization(etype, r_size, r_value);
+ if(native_long_sign(arg, r_value) >= 0) {
+ ulong_optimize = ulong_optimization(arg, etype, r_size, r_value);
if(!ulong_optimize) {
OUT("unsigned long value;\n");
}
@@ -643,7 +643,7 @@
break;
}
- if(native_long_sign(r_value) >= 0) {
+ if(native_long_sign(arg, r_value) >= 0) {
/* Special case for treating unsigned longs */
OUT("if(asn_INTEGER2ulong(st, &value)) {\n");
INDENT(+1);
@@ -710,7 +710,12 @@
}
static int
-native_long_sign(asn1cnst_range_t *r) {
+native_long_sign(arg_t *arg, asn1cnst_range_t *r) {
+ if(!(arg->flags & A1C_USE_WIDE_TYPES) && r->left.type == ARE_VALUE
+ && r->left.value >= 0 && r->left.value <= 2147483647
+ && r->right.type == ARE_MAX) {
+ return 1;
+ }
if(r->left.type == ARE_VALUE
&& r->left.value >= 0
&& r->right.type == ARE_VALUE
diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c
index 665b748..99c275b 100644
--- a/libasn1compiler/asn1c_misc.c
+++ b/libasn1compiler/asn1c_misc.c
@@ -406,6 +406,9 @@
asn1constraint_range_free(range);
/* Special case for unsigned */
+ if(!(arg->flags & A1C_USE_WIDE_TYPES) && left.type == ARE_VALUE
+ && left.value >= 0 && left.value <= 2147483647 && right.type == ARE_MAX)
+ return FL_FITS_UNSIGN;
if(left.type == ARE_VALUE
&& left.value >= 0
&& right.type == ARE_VALUE