aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-08-16 16:56:59 +0000
committerLev Walkin <vlm@lionet.info>2005-08-16 16:56:59 +0000
commitcee931eec71817d26569c34df7f1a9e7be514843 (patch)
tree3217dbde3adcbcb485d05f72593fa4c1fd859156
parent1ce7207cca8ed6cc098cf30721a1ea96dbcc8d27 (diff)
new circular references test
-rw-r--r--tests/92-circular-loops-OK.asn149
-rw-r--r--tests/92-circular-loops-OK.asn1.-P519
-rw-r--r--tests/92-circular-loops-OK.asn1.-Pfindirect-choice533
3 files changed, 1101 insertions, 0 deletions
diff --git a/tests/92-circular-loops-OK.asn1 b/tests/92-circular-loops-OK.asn1
new file mode 100644
index 00000000..956e2ac1
--- /dev/null
+++ b/tests/92-circular-loops-OK.asn1
@@ -0,0 +1,49 @@
+
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .92
+
+ModuleCircularReferences
+ { iso org(3) dod(6) internet (1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 92 }
+DEFINITIONS AUTOMATIC TAGS ::=
+BEGIN
+
+ Everything ::= SEQUENCE {
+ ch1 Choice1,
+ ch2 Choice2,
+ set Set
+ }
+
+ -- This type refers to the type directly containing itself.
+ Choice1 ::= CHOICE {
+ something Everything,
+ ...,
+ some2 Everything
+ }
+
+ Choice2 ::= CHOICE {
+ ...,
+ some3 Everything
+ }
+
+ Set ::= SET OF SEQUENCE {
+ int INTEGER,
+ set Set,
+ seq Sequence,
+ set2 Set OPTIONAL,
+ ...,
+ set3 Set
+ }
+
+ Sequence ::= SEQUENCE {
+ a INTEGER,
+ seq Sequence OPTIONAL,
+ ...,
+ b INTEGER,
+ set Set OPTIONAL
+ }
+
+END
diff --git a/tests/92-circular-loops-OK.asn1.-P b/tests/92-circular-loops-OK.asn1.-P
new file mode 100644
index 00000000..837b355d
--- /dev/null
+++ b/tests/92-circular-loops-OK.asn1.-P
@@ -0,0 +1,519 @@
+
+/*** <<< INCLUDES [Everything] >>> ***/
+
+#include <Choice1.h>
+#include <Choice2.h>
+#include <Set.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< TYPE-DECLS [Everything] >>> ***/
+
+typedef struct Everything {
+ Choice1_t ch1;
+ Choice2_t ch2;
+ Set_t set;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Everything_t;
+
+/*** <<< FUNC-DECLS [Everything] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Everything;
+
+/*** <<< STAT-DEFS [Everything] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Everything_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, ch1),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = +1, /* EXPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Choice1,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "ch1"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, ch2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = +1, /* EXPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Choice2,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "ch2"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Everything_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ch1 at 15 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ch2 at 16 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* set at 18 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Everything_1_specs = {
+ sizeof(struct Everything),
+ offsetof(struct Everything, _asn_ctx),
+ asn_MAP_Everything_1_tag2el,
+ 3, /* Count of tags in the map */
+ -1, /* Start extensions */
+ -1 /* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Everything = {
+ "Everything",
+ "Everything",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Everything_1_tags,
+ sizeof(asn_DEF_Everything_1_tags)
+ /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */
+ asn_DEF_Everything_1_tags, /* Same as above */
+ sizeof(asn_DEF_Everything_1_tags)
+ /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */
+ asn_MBR_Everything_1,
+ 3, /* Elements count */
+ &asn_SPC_Everything_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Choice1] >>> ***/
+
+#include <Everything.h>
+#include <constr_CHOICE.h>
+
+/*** <<< DEPS [Choice1] >>> ***/
+
+typedef enum Choice1_PR {
+ Choice1_PR_NOTHING, /* No components present */
+ Choice1_PR_something,
+ /* Extensions may appear below */
+ Choice1_PR_some2,
+} Choice1_PR;
+
+/*** <<< TYPE-DECLS [Choice1] >>> ***/
+
+typedef struct Choice1 {
+ Choice1_PR present;
+ union Choice1_u {
+ Everything_t something;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ Everything_t some2;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Choice1_t;
+
+/*** <<< FUNC-DECLS [Choice1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice1;
+
+/*** <<< STAT-DEFS [Choice1] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Choice1_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.something),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "something"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.some2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "some2"
+ },
+};
+static asn_TYPE_tag2member_t asn_MAP_Choice1_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* something at 22 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some2 at 25 */
+};
+static asn_CHOICE_specifics_t asn_SPC_Choice1_1_specs = {
+ sizeof(struct Choice1),
+ offsetof(struct Choice1, _asn_ctx),
+ offsetof(struct Choice1, present),
+ sizeof(((struct Choice1 *)0)->present),
+ asn_MAP_Choice1_1_tag2el,
+ 2, /* Count of tags in the map */
+ 1 /* Whether extensible */
+};
+asn_TYPE_descriptor_t asn_DEF_Choice1 = {
+ "Choice1",
+ "Choice1",
+ CHOICE_free,
+ CHOICE_print,
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_decode_xer,
+ CHOICE_encode_xer,
+ CHOICE_outmost_tag,
+ 0, /* No effective tags (pointer) */
+ 0, /* No effective tags (count) */
+ 0, /* No tags (pointer) */
+ 0, /* No tags (count) */
+ asn_MBR_Choice1_1,
+ 2, /* Elements count */
+ &asn_SPC_Choice1_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Choice2] >>> ***/
+
+#include <Everything.h>
+#include <constr_CHOICE.h>
+
+/*** <<< DEPS [Choice2] >>> ***/
+
+typedef enum Choice2_PR {
+ Choice2_PR_NOTHING, /* No components present */
+ /* Extensions may appear below */
+ Choice2_PR_some3,
+} Choice2_PR;
+
+/*** <<< TYPE-DECLS [Choice2] >>> ***/
+
+typedef struct Choice2 {
+ Choice2_PR present;
+ union Choice2_u {
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ Everything_t some3;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Choice2_t;
+
+/*** <<< FUNC-DECLS [Choice2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice2;
+
+/*** <<< STAT-DEFS [Choice2] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Choice2_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.some3),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "some3"
+ },
+};
+static asn_TYPE_tag2member_t asn_MAP_Choice2_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* some3 at 30 */
+};
+static asn_CHOICE_specifics_t asn_SPC_Choice2_1_specs = {
+ sizeof(struct Choice2),
+ offsetof(struct Choice2, _asn_ctx),
+ offsetof(struct Choice2, present),
+ sizeof(((struct Choice2 *)0)->present),
+ asn_MAP_Choice2_1_tag2el,
+ 1, /* Count of tags in the map */
+ 1 /* Whether extensible */
+};
+asn_TYPE_descriptor_t asn_DEF_Choice2 = {
+ "Choice2",
+ "Choice2",
+ CHOICE_free,
+ CHOICE_print,
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_decode_xer,
+ CHOICE_encode_xer,
+ CHOICE_outmost_tag,
+ 0, /* No effective tags (pointer) */
+ 0, /* No effective tags (count) */
+ 0, /* No tags (pointer) */
+ 0, /* No tags (count) */
+ asn_MBR_Choice2_1,
+ 1, /* Elements count */
+ &asn_SPC_Choice2_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Set] >>> ***/
+
+#include <asn_SET_OF.h>
+#include <INTEGER.h>
+#include <Sequence.h>
+#include <constr_SEQUENCE.h>
+#include <constr_SET_OF.h>
+
+/*** <<< FWD-DECLS [Set] >>> ***/
+
+struct Set;
+
+/*** <<< TYPE-DECLS [Set] >>> ***/
+
+typedef struct Set {
+ A_SET_OF(struct Member {
+ INTEGER_t Int;
+ struct Set *set;
+ Sequence_t seq;
+ struct Set *set2 /* OPTIONAL */;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ struct Set *set3;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+ } ) list;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Set_t;
+
+/*** <<< FUNC-DECLS [Set] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Set;
+
+/*** <<< POST-INCLUDE [Set] >>> ***/
+
+#include <Set.h>
+
+/*** <<< STAT-DEFS [Set] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Member, Int),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "int"
+ },
+ { ATF_POINTER, 0, offsetof(struct Member, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Member, seq),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Sequence,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "seq"
+ },
+ { ATF_POINTER, 2, offsetof(struct Member, set2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set2"
+ },
+ { ATF_POINTER, 0, offsetof(struct Member, set3),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set3"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Member_2_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Member_2_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* int at 33 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 34 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* seq at 35 */
+ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* set2 at 36 */
+ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* set3 at 39 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_2_specs = {
+ sizeof(struct Member),
+ offsetof(struct Member, _asn_ctx),
+ asn_MAP_Member_2_tag2el,
+ 5, /* Count of tags in the map */
+ 3, /* Start extensions */
+ 6 /* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+ "",
+ "",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Member_2_tags,
+ sizeof(asn_DEF_Member_2_tags)
+ /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */
+ asn_DEF_Member_2_tags, /* Same as above */
+ sizeof(asn_DEF_Member_2_tags)
+ /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */
+ asn_MBR_Member_2,
+ 5, /* Elements count */
+ &asn_SPC_Member_2_specs /* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_Set_1[] = {
+ { ATF_POINTER, 0, 0,
+ .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+ .tag_mode = 0,
+ .type = (void *)&asn_DEF_Member_2,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = ""
+ },
+};
+static ber_tlv_tag_t asn_DEF_Set_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_Set_1_specs = {
+ sizeof(struct Set),
+ offsetof(struct Set, _asn_ctx),
+ 0, /* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_Set = {
+ "Set",
+ "Set",
+ SET_OF_free,
+ SET_OF_print,
+ SET_OF_constraint,
+ SET_OF_decode_ber,
+ SET_OF_encode_der,
+ SET_OF_decode_xer,
+ SET_OF_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Set_1_tags,
+ sizeof(asn_DEF_Set_1_tags)
+ /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */
+ asn_DEF_Set_1_tags, /* Same as above */
+ sizeof(asn_DEF_Set_1_tags)
+ /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */
+ asn_MBR_Set_1,
+ 1, /* Single element */
+ &asn_SPC_Set_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Sequence] >>> ***/
+
+#include <INTEGER.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< FWD-DECLS [Sequence] >>> ***/
+
+struct Sequence;
+struct Set;
+
+/*** <<< TYPE-DECLS [Sequence] >>> ***/
+
+typedef struct Sequence {
+ INTEGER_t a;
+ struct Sequence *seq /* OPTIONAL */;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ INTEGER_t *b;
+ struct Set *set /* OPTIONAL */;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Sequence_t;
+
+/*** <<< FUNC-DECLS [Sequence] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Sequence;
+
+/*** <<< POST-INCLUDE [Sequence] >>> ***/
+
+#include <Sequence.h>
+#include <Set.h>
+
+/*** <<< STAT-DEFS [Sequence] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Sequence_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Sequence, a),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "a"
+ },
+ { ATF_POINTER, 3, offsetof(struct Sequence, seq),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Sequence,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "seq"
+ },
+ { ATF_POINTER, 0, offsetof(struct Sequence, b),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "b"
+ },
+ { ATF_POINTER, 1, offsetof(struct Sequence, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 42 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* seq at 43 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* b at 45 */
+ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* set at 46 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = {
+ sizeof(struct Sequence),
+ offsetof(struct Sequence, _asn_ctx),
+ asn_MAP_Sequence_1_tag2el,
+ 4, /* Count of tags in the map */
+ 1, /* Start extensions */
+ 5 /* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Sequence = {
+ "Sequence",
+ "Sequence",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Sequence_1_tags,
+ sizeof(asn_DEF_Sequence_1_tags)
+ /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */
+ asn_DEF_Sequence_1_tags, /* Same as above */
+ sizeof(asn_DEF_Sequence_1_tags)
+ /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */
+ asn_MBR_Sequence_1,
+ 4, /* Elements count */
+ &asn_SPC_Sequence_1_specs /* Additional specs */
+};
+
diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice
new file mode 100644
index 00000000..7f21fe13
--- /dev/null
+++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice
@@ -0,0 +1,533 @@
+
+/*** <<< INCLUDES [Everything] >>> ***/
+
+#include <Choice1.h>
+#include <Choice2.h>
+#include <Set.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< TYPE-DECLS [Everything] >>> ***/
+
+typedef struct Everything {
+ Choice1_t ch1;
+ Choice2_t ch2;
+ Set_t set;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Everything_t;
+
+/*** <<< FUNC-DECLS [Everything] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Everything;
+
+/*** <<< STAT-DEFS [Everything] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Everything_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, ch1),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = +1, /* EXPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Choice1,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "ch1"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, ch2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = +1, /* EXPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Choice2,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "ch2"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Everything, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Everything_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ch1 at 15 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ch2 at 16 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* set at 18 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Everything_1_specs = {
+ sizeof(struct Everything),
+ offsetof(struct Everything, _asn_ctx),
+ asn_MAP_Everything_1_tag2el,
+ 3, /* Count of tags in the map */
+ -1, /* Start extensions */
+ -1 /* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Everything = {
+ "Everything",
+ "Everything",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Everything_1_tags,
+ sizeof(asn_DEF_Everything_1_tags)
+ /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */
+ asn_DEF_Everything_1_tags, /* Same as above */
+ sizeof(asn_DEF_Everything_1_tags)
+ /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */
+ asn_MBR_Everything_1,
+ 3, /* Elements count */
+ &asn_SPC_Everything_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Choice1] >>> ***/
+
+#include <constr_CHOICE.h>
+
+/*** <<< DEPS [Choice1] >>> ***/
+
+typedef enum Choice1_PR {
+ Choice1_PR_NOTHING, /* No components present */
+ Choice1_PR_something,
+ /* Extensions may appear below */
+ Choice1_PR_some2,
+} Choice1_PR;
+
+/*** <<< FWD-DECLS [Choice1] >>> ***/
+
+struct Everything;
+
+/*** <<< TYPE-DECLS [Choice1] >>> ***/
+
+typedef struct Choice1 {
+ Choice1_PR present;
+ union Choice1_u {
+ struct Everything *something;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ struct Everything *some2;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Choice1_t;
+
+/*** <<< FUNC-DECLS [Choice1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice1;
+
+/*** <<< POST-INCLUDE [Choice1] >>> ***/
+
+#include <Everything.h>
+
+/*** <<< STAT-DEFS [Choice1] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Choice1_1[] = {
+ { ATF_POINTER, 0, offsetof(struct Choice1, choice.something),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "something"
+ },
+ { ATF_POINTER, 0, offsetof(struct Choice1, choice.some2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "some2"
+ },
+};
+static asn_TYPE_tag2member_t asn_MAP_Choice1_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* something at 22 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some2 at 25 */
+};
+static asn_CHOICE_specifics_t asn_SPC_Choice1_1_specs = {
+ sizeof(struct Choice1),
+ offsetof(struct Choice1, _asn_ctx),
+ offsetof(struct Choice1, present),
+ sizeof(((struct Choice1 *)0)->present),
+ asn_MAP_Choice1_1_tag2el,
+ 2, /* Count of tags in the map */
+ 1 /* Whether extensible */
+};
+asn_TYPE_descriptor_t asn_DEF_Choice1 = {
+ "Choice1",
+ "Choice1",
+ CHOICE_free,
+ CHOICE_print,
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_decode_xer,
+ CHOICE_encode_xer,
+ CHOICE_outmost_tag,
+ 0, /* No effective tags (pointer) */
+ 0, /* No effective tags (count) */
+ 0, /* No tags (pointer) */
+ 0, /* No tags (count) */
+ asn_MBR_Choice1_1,
+ 2, /* Elements count */
+ &asn_SPC_Choice1_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Choice2] >>> ***/
+
+#include <constr_CHOICE.h>
+
+/*** <<< DEPS [Choice2] >>> ***/
+
+typedef enum Choice2_PR {
+ Choice2_PR_NOTHING, /* No components present */
+ /* Extensions may appear below */
+ Choice2_PR_some3,
+} Choice2_PR;
+
+/*** <<< FWD-DECLS [Choice2] >>> ***/
+
+struct Everything;
+
+/*** <<< TYPE-DECLS [Choice2] >>> ***/
+
+typedef struct Choice2 {
+ Choice2_PR present;
+ union Choice2_u {
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ struct Everything *some3;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Choice2_t;
+
+/*** <<< FUNC-DECLS [Choice2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice2;
+
+/*** <<< POST-INCLUDE [Choice2] >>> ***/
+
+#include <Everything.h>
+
+/*** <<< STAT-DEFS [Choice2] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Choice2_1[] = {
+ { ATF_POINTER, 0, offsetof(struct Choice2, choice.some3),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Everything,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "some3"
+ },
+};
+static asn_TYPE_tag2member_t asn_MAP_Choice2_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* some3 at 30 */
+};
+static asn_CHOICE_specifics_t asn_SPC_Choice2_1_specs = {
+ sizeof(struct Choice2),
+ offsetof(struct Choice2, _asn_ctx),
+ offsetof(struct Choice2, present),
+ sizeof(((struct Choice2 *)0)->present),
+ asn_MAP_Choice2_1_tag2el,
+ 1, /* Count of tags in the map */
+ 1 /* Whether extensible */
+};
+asn_TYPE_descriptor_t asn_DEF_Choice2 = {
+ "Choice2",
+ "Choice2",
+ CHOICE_free,
+ CHOICE_print,
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_decode_xer,
+ CHOICE_encode_xer,
+ CHOICE_outmost_tag,
+ 0, /* No effective tags (pointer) */
+ 0, /* No effective tags (count) */
+ 0, /* No tags (pointer) */
+ 0, /* No tags (count) */
+ asn_MBR_Choice2_1,
+ 1, /* Elements count */
+ &asn_SPC_Choice2_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Set] >>> ***/
+
+#include <asn_SET_OF.h>
+#include <INTEGER.h>
+#include <Sequence.h>
+#include <constr_SEQUENCE.h>
+#include <constr_SET_OF.h>
+
+/*** <<< FWD-DECLS [Set] >>> ***/
+
+struct Set;
+
+/*** <<< TYPE-DECLS [Set] >>> ***/
+
+typedef struct Set {
+ A_SET_OF(struct Member {
+ INTEGER_t Int;
+ struct Set *set;
+ Sequence_t seq;
+ struct Set *set2 /* OPTIONAL */;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ struct Set *set3;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+ } ) list;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Set_t;
+
+/*** <<< FUNC-DECLS [Set] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Set;
+
+/*** <<< POST-INCLUDE [Set] >>> ***/
+
+#include <Set.h>
+
+/*** <<< STAT-DEFS [Set] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Member, Int),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "int"
+ },
+ { ATF_POINTER, 0, offsetof(struct Member, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+ { ATF_NOFLAGS, 0, offsetof(struct Member, seq),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Sequence,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "seq"
+ },
+ { ATF_POINTER, 2, offsetof(struct Member, set2),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set2"
+ },
+ { ATF_POINTER, 0, offsetof(struct Member, set3),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set3"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Member_2_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Member_2_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* int at 33 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 34 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* seq at 35 */
+ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* set2 at 36 */
+ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* set3 at 39 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_2_specs = {
+ sizeof(struct Member),
+ offsetof(struct Member, _asn_ctx),
+ asn_MAP_Member_2_tag2el,
+ 5, /* Count of tags in the map */
+ 3, /* Start extensions */
+ 6 /* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+ "",
+ "",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Member_2_tags,
+ sizeof(asn_DEF_Member_2_tags)
+ /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */
+ asn_DEF_Member_2_tags, /* Same as above */
+ sizeof(asn_DEF_Member_2_tags)
+ /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */
+ asn_MBR_Member_2,
+ 5, /* Elements count */
+ &asn_SPC_Member_2_specs /* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_Set_1[] = {
+ { ATF_POINTER, 0, 0,
+ .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+ .tag_mode = 0,
+ .type = (void *)&asn_DEF_Member_2,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = ""
+ },
+};
+static ber_tlv_tag_t asn_DEF_Set_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_Set_1_specs = {
+ sizeof(struct Set),
+ offsetof(struct Set, _asn_ctx),
+ 0, /* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_Set = {
+ "Set",
+ "Set",
+ SET_OF_free,
+ SET_OF_print,
+ SET_OF_constraint,
+ SET_OF_decode_ber,
+ SET_OF_encode_der,
+ SET_OF_decode_xer,
+ SET_OF_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Set_1_tags,
+ sizeof(asn_DEF_Set_1_tags)
+ /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */
+ asn_DEF_Set_1_tags, /* Same as above */
+ sizeof(asn_DEF_Set_1_tags)
+ /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */
+ asn_MBR_Set_1,
+ 1, /* Single element */
+ &asn_SPC_Set_1_specs /* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Sequence] >>> ***/
+
+#include <INTEGER.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< FWD-DECLS [Sequence] >>> ***/
+
+struct Sequence;
+struct Set;
+
+/*** <<< TYPE-DECLS [Sequence] >>> ***/
+
+typedef struct Sequence {
+ INTEGER_t a;
+ struct Sequence *seq /* OPTIONAL */;
+ /*
+ * This type is extensible,
+ * possible extensions are below.
+ */
+ INTEGER_t *b;
+ struct Set *set /* OPTIONAL */;
+
+ /* Context for parsing across buffer boundaries */
+ asn_struct_ctx_t _asn_ctx;
+} Sequence_t;
+
+/*** <<< FUNC-DECLS [Sequence] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Sequence;
+
+/*** <<< POST-INCLUDE [Sequence] >>> ***/
+
+#include <Sequence.h>
+#include <Set.h>
+
+/*** <<< STAT-DEFS [Sequence] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Sequence_1[] = {
+ { ATF_NOFLAGS, 0, offsetof(struct Sequence, a),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "a"
+ },
+ { ATF_POINTER, 3, offsetof(struct Sequence, seq),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Sequence,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "seq"
+ },
+ { ATF_POINTER, 0, offsetof(struct Sequence, b),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_INTEGER,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "b"
+ },
+ { ATF_POINTER, 1, offsetof(struct Sequence, set),
+ .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+ .tag_mode = -1, /* IMPLICIT tag at current level */
+ .type = (void *)&asn_DEF_Set,
+ .memb_constraints = 0, /* Defer constraints checking to the member type */
+ .name = "set"
+ },
+};
+static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = {
+ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = {
+ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 42 */
+ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* seq at 43 */
+ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* b at 45 */
+ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* set at 46 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = {
+ sizeof(struct Sequence),
+ offsetof(struct Sequence, _asn_ctx),
+ asn_MAP_Sequence_1_tag2el,
+ 4, /* Count of tags in the map */
+ 1, /* Start extensions */
+ 5 /* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Sequence = {
+ "Sequence",
+ "Sequence",
+ SEQUENCE_free,
+ SEQUENCE_print,
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_decode_xer,
+ SEQUENCE_encode_xer,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_Sequence_1_tags,
+ sizeof(asn_DEF_Sequence_1_tags)
+ /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */
+ asn_DEF_Sequence_1_tags, /* Same as above */
+ sizeof(asn_DEF_Sequence_1_tags)
+ /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */
+ asn_MBR_Sequence_1,
+ 4, /* Elements count */
+ &asn_SPC_Sequence_1_specs /* Additional specs */
+};
+