diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c
index 2b1420e81fcf7af3a4b671dfd015b8b879060438..e9d796def7110fa946a804f015aadef0511df1d7 100644
--- a/libasn1compiler/asn1c_constraint.c
+++ b/libasn1compiler/asn1c_constraint.c
@@ -14,6 +14,16 @@ 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
+ulong_optimization(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);
+}
+
 int
 asn1c_emit_constraint_checking_code(arg_t *arg) {
 	asn1cnst_range_t *r_size;
@@ -24,6 +34,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) {
 	int got_something = 0;
 	int alphabet_table_compiled;
 	int produce_st = 0;
+	int ulong_optimize = 0;
 
 	ct = expr->combined_constraints;
 	if(ct == NULL)
@@ -93,7 +104,10 @@ asn1c_emit_constraint_checking_code(arg_t *arg) {
 			case ASN_BASIC_INTEGER:
 			case ASN_BASIC_ENUMERATED:
 				if(native_long_sign(r_value) >= 0) {
-					OUT("unsigned long value;\n");
+					ulong_optimize = ulong_optimization(etype, r_size, r_value);
+					if(!ulong_optimize) {
+						OUT("unsigned long value;\n");
+					}
 				} else {
 					OUT("long value;\n");
 				}
@@ -124,7 +138,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) {
 	OUT("}\n");
 	OUT("\n");
 
-	if(r_value)
+	if((r_value) && (!ulong_optimize))
 		emit_value_determination_code(arg, etype, r_value);
 	if(r_size)
 		emit_size_determination_code(arg, etype);
@@ -140,10 +154,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) {
 	/*
 	 * Optimization for unsigned longs.
 	 */
-	if(!r_size && r_value
-		&& (etype == ASN_BASIC_INTEGER
-		|| etype == ASN_BASIC_ENUMERATED)
-	&& native_long_sign(r_value) == 0) {
+	if(ulong_optimize) {
 		OUT("\n");
 		OUT("/* Constraint check succeeded */\n");
 		OUT("return 0;\n");