From 3645c1c1f94504ea1a88fbdefc04688096c7d291 Mon Sep 17 00:00:00 2001
From: Lev Walkin <vlm@lionet.info>
Date: Sun, 31 Oct 2004 00:11:50 +0000
Subject: [PATCH] removed order dependency in DEFAULT references

---
 ChangeLog                     |  4 +++-
 libasn1fix/asn1fix.c          |  6 ++++++
 libasn1fix/asn1fix_derefv.c   | 12 ++++++++++++
 libasn1fix/asn1fix_derefv.h   |  2 ++
 tests/68-enum-default-OK.asn1 | 21 +++++++++++++++++++++
 5 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 tests/68-enum-default-OK.asn1

diff --git a/ChangeLog b/ChangeLog
index 26c1d9ef..c9268e28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,5 @@
 
-0.9.8:	2004-Oct-26
+0.9.8:	2004-Oct-30
 
 	* [NEW PLATFORM] Compiled and tested on Linux @ alpha64 (LP64).
 	  Some code needed to be fixed regarding int-long conversions
@@ -13,6 +13,8 @@
 	* Empty SEQUENCE and SET clauses are now allowed.
 	* Removed confusion between &xNN; and &#xNN; in enber and unber.
 	* ber_dec_rval_t renamed into asn_dec_rval_t: more generality.
+	* Removed order dependency in DEFAULT references to ENUMERATED
+	  identifiers (./tests/68-*-OK.asn1).
 
 0.9.7.1:	2004-Oct-12
 
diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c
index 33123fc2..7bfb9034 100644
--- a/libasn1fix/asn1fix.c
+++ b/libasn1fix/asn1fix.c
@@ -261,6 +261,12 @@ asn1f_fix_module__phase_2(arg_t *arg) {
 			/* Do not process the parametrized types here */
 			continue;
 
+		/*
+		 * Dereference DEFAULT values.
+		 */
+		ret = asn1f_recurse_expr(arg, asn1f_fix_dereference_defaults);
+		RET2RVAL(ret, rvalue);
+
 		/*
 		 * Check semantic validity of constraints.
 		 */
diff --git a/libasn1fix/asn1fix_derefv.c b/libasn1fix/asn1fix_derefv.c
index eb67ac3f..261425c8 100644
--- a/libasn1fix/asn1fix_derefv.c
+++ b/libasn1fix/asn1fix_derefv.c
@@ -15,6 +15,18 @@ asn1f_fix_dereference_values(arg_t *arg) {
 		}
 	}
 
+	return r_value;
+}
+
+
+/*
+ * Dereference DEFAULT values
+ */
+int
+asn1f_fix_dereference_defaults(arg_t *arg) {
+	asn1p_expr_t *expr = arg->expr;
+	int r_value = 0;
+
 	if(expr->marker.default_value) {
 		arg_t tmparg = *arg;
 		asn1p_expr_t tmpexpr = *expr;
diff --git a/libasn1fix/asn1fix_derefv.h b/libasn1fix/asn1fix_derefv.h
index 93153851..3964f539 100644
--- a/libasn1fix/asn1fix_derefv.h
+++ b/libasn1fix/asn1fix_derefv.h
@@ -3,4 +3,6 @@
 
 int asn1f_fix_dereference_values(arg_t *);
 
+int asn1f_fix_dereference_defaults(arg_t *);
+
 #endif	/* _ASN1FIX_DEREFV_H_ */
diff --git a/tests/68-enum-default-OK.asn1 b/tests/68-enum-default-OK.asn1
new file mode 100644
index 00000000..0b26cf79
--- /dev/null
+++ b/tests/68-enum-default-OK.asn1
@@ -0,0 +1,21 @@
+
+-- OK: Everything is Fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .68
+
+ModuleTestEnumeratedDefault
+	{ iso org(3) dod(6) internet(1) private(4) enterprise(1)
+		spelio(9363) software(1) asn1c(5) test(1) 68 }
+	DEFINITIONS ::=
+BEGIN
+
+	Type ::= SEQUENCE {
+		reportAmount ReportAmount DEFAULT ra-default,
+		reportInterval	INTEGER
+	}
+
+	ReportAmount ::= ENUMERATED { a, b, c, ra-default }
+
+END
-- 
GitLab