C90-compliant negative LONG_MIN
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index ef0c868..e2b4401 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -1859,8 +1859,7 @@
 				if(lv > 0x7fffffff) { lv = 0x7fffffff; gcmt++; }
 				if(rv > 0x7fffffff) { rv = 0x7fffffff; gcmt++; }
 				if(gcmt) {
-					OUT("% " PRIdASN ", % " PRIdASN " }",
-						lv, rv);
+					OINTS(lv); OUT(", "); OINTS(rv); OUT(" }");
 					goto pcmt;
 				}
 			}
@@ -1872,8 +1871,8 @@
 				OUT("{ APC_SEMI_CONSTRAINED,\t-1, -1, ");
 			}
 		}
-		OUT("% " PRIdASN ", % " PRIdASN " }",
-			range->left.value, range->right.value);
+		OINTS(range->left.value); OUT(", ");
+		OINTS(range->right.value); OUT(" }");
 	} else {
 		OUT("{ APC_UNCONSTRAINED,\t-1, -1,  0,  0 }");
 	}
@@ -2129,12 +2128,14 @@
 		OUT("/* Install default value %" PRIdASN " */\n",
 			expr->marker.default_value->value.v_integer);
 		if(fits_long) {
-			OUT("*st = %" PRIdASN ";\n",
-				expr->marker.default_value->value.v_integer);
+			OUT("*st = ");
+			OINT(expr->marker.default_value->value.v_integer);
+			OUT(";\n");
 			OUT("return 0;\n");
 		} else {
-			OUT("return asn_long2INTEGER(st, %" PRIdASN ");\n",
-				expr->marker.default_value->value.v_integer);
+			OUT("return asn_long2INTEGER(st, ");
+			OINT(expr->marker.default_value->value.v_integer);
+			OUT(");\n");
 		}
 		INDENT(-1);
 		OUT("} else {\n");
diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c
index 1e2efa4..ea9df80 100644
--- a/libasn1compiler/asn1c_constraint.c
+++ b/libasn1compiler/asn1c_constraint.c
@@ -495,20 +495,20 @@
 		}
 
 		if(ignore_left) {
-			OUT("%s <= %" PRIdASN, varname,
-				r->right.value);
+			OUT("%s <= ", varname);
+			OINT(r->right.value);
 		} else if(ignore_right) {
-			OUT("%s >= %" PRIdASN, varname,
-				r->left.value);
+			OUT("%s >= ", varname);
+			OINT(r->left.value);
 		} else if(r->left.value == r->right.value) {
-			OUT("%s == %" PRIdASN, varname,
-				r->right.value);
+			OUT("%s == ", varname);
+			OINT(r->right.value);
 		} else {
-			OUT("%s >= %" PRIdASN " && %s <= %" PRIdASN,
-				varname,
-				r->left.value,
-				varname,
-				r->right.value);
+			OUT("%s >= ", varname);
+			OINT(r->left.value);
+			OUT(" && ");
+			OUT("%s <= ", varname);
+			OINT(r->right.value);
 		}
 		if(r != range) OUT(")");
 		generated_something = 1;
diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h
index 0523cbc..04d7ff2 100644
--- a/libasn1compiler/asn1c_out.h
+++ b/libasn1compiler/asn1c_out.h
@@ -108,4 +108,21 @@
 	REDIR(saved_target);					\
 } while(0)
 
+/*
+ * Format LONG_MIN according to C90 rules.
+ */
+#define OINT(iv)	do {					\
+	if(iv == (-2147483647L - 1))				\
+		OUT("(-2147483647L - 1)");			\
+	else							\
+		OUT("%" PRIdASN, iv);				\
+} while(0)
+
+#define OINTS(iv)	do {					\
+	if(iv == (-2147483647L - 1))				\
+		OUT("(-2147483647L - 1)");			\
+	else							\
+		OUT("% " PRIdASN, iv);				\
+} while(0)
+
 #endif	/* _ASN1_COMPILED_OUTPUT_H_ */
diff --git a/tests/90-cond-int-type-OK.asn1.-P b/tests/90-cond-int-type-OK.asn1.-P
index 431e42c..5055e4d 100644
--- a/tests/90-cond-int-type-OK.asn1.-P
+++ b/tests/90-cond-int-type-OK.asn1.-P
@@ -1754,7 +1754,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if((value >= -2147483648 && value <= 2147483647)) {
+	if((value >= (-2147483647L - 1) && value <= 2147483647)) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -1895,7 +1895,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -2042,7 +2042,7 @@
 		return -1;
 	}
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
diff --git a/tests/90-cond-int-type-OK.asn1.-Pfnative-types b/tests/90-cond-int-type-OK.asn1.-Pfnative-types
index 344c89a..461e5eb 100644
--- a/tests/90-cond-int-type-OK.asn1.-Pfnative-types
+++ b/tests/90-cond-int-type-OK.asn1.-Pfnative-types
@@ -1741,7 +1741,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if((value >= -2147483648 && value <= 2147483647)) {
+	if((value >= (-2147483647L - 1) && value <= 2147483647)) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -1882,7 +1882,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -2023,7 +2023,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
diff --git a/tests/90-cond-int-type-OK.asn1.-Pgen-PER b/tests/90-cond-int-type-OK.asn1.-Pgen-PER
index c7e90db..d7957cb 100644
--- a/tests/90-cond-int-type-OK.asn1.-Pgen-PER
+++ b/tests/90-cond-int-type-OK.asn1.-Pgen-PER
@@ -2060,7 +2060,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if((value >= -2147483648 && value <= 2147483647)) {
+	if((value >= (-2147483647L - 1) && value <= 2147483647)) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -2155,7 +2155,7 @@
 /*** <<< CTDEFS [OK-IntegerInRange3] >>> ***/
 
 static asn_per_constraints_t asn_PER_type_OK_IntegerInRange3_constr_1 = {
-	{ APC_CONSTRAINED,	 32, -1, -2147483648,  2147483647 }	/* (-2147483648..2147483647) */,
+	{ APC_CONSTRAINED,	 32, -1, (-2147483647L - 1),  2147483647 }	/* (-2147483648..2147483647) */,
 	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
 	0, 0	/* No PER value map */
 };
@@ -2227,7 +2227,7 @@
 	
 	value = *(const long *)sptr;
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -2322,7 +2322,7 @@
 /*** <<< CTDEFS [OK-IntegerInRange4] >>> ***/
 
 static asn_per_constraints_t asn_PER_type_OK_IntegerInRange4_constr_1 = {
-	{ APC_CONSTRAINED,	 32, -1, -2147483648,  2147483647 }	/* (-2147483648..2147483647) */,
+	{ APC_CONSTRAINED,	 32, -1, (-2147483647L - 1),  2147483647 }	/* (-2147483648..2147483647) */,
 	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
 	0, 0	/* No PER value map */
 };
@@ -2400,7 +2400,7 @@
 		return -1;
 	}
 	
-	if(((value == -2147483648) || (value == 2147483647))) {
+	if(((value == (-2147483647L - 1)) || (value == 2147483647))) {
 		/* Constraint check succeeded */
 		return 0;
 	} else {
@@ -2495,7 +2495,7 @@
 /*** <<< CTDEFS [OK-IntegerInRange5] >>> ***/
 
 static asn_per_constraints_t asn_PER_type_OK_IntegerInRange5_constr_1 = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  32, -1, -2147483648,  2147483647 }	/* (-2147483648..2147483647,...) */,
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  32, -1, (-2147483647L - 1),  2147483647 }	/* (-2147483648..2147483647,...) */,
 	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
 	0, 0	/* No PER value map */
 };