ANY/OCTET STRING/BIT STRING testing, plus numerous test cases

diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am
index 24d0a38..9791613 100644
--- a/asn1c/tests/Makefile.am
+++ b/asn1c/tests/Makefile.am
@@ -11,7 +11,12 @@
 TESTS = check-*.c
 endif
 
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
 
 clean:
-	for t in test-*; do rm -rf $$t; done
+	rm -rf test-*
+
+SUFFIXES = .xbr .ber
+
+.xbr.ber:
+	../enber $< > $@
diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in
index e4b6b3b..00336bf 100644
--- a/asn1c/tests/Makefile.in
+++ b/asn1c/tests/Makefile.in
@@ -160,10 +160,12 @@
 TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh
 @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c
 @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc	## Include C++ test filed (.cc)
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
+SUFFIXES = .xbr .ber
 all: all-am
 
 .SUFFIXES:
+.SUFFIXES: .xbr .ber
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -284,6 +286,7 @@
 	else :; fi
 
 distdir: $(DISTFILES)
+	$(mkdir_p) $(distdir)/data-*
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
 	list='$(DISTFILES)'; for file in $$list; do \
@@ -396,7 +399,10 @@
 
 
 clean:
-	for t in test-*; do rm -rf $$t; done
+	rm -rf test-*
+
+.xbr.ber:
+	../enber $< > $@
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c
new file mode 100644
index 0000000..06287a8
--- /dev/null
+++ b/asn1c/tests/check-62.c
@@ -0,0 +1,193 @@
+#undef	NDEBUG
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>	/* for chdir(2) */
+#include <string.h>
+#include <dirent.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <T.h>
+
+enum expectation {
+	EXP_OK,		/* Encoding/decoding must succeed */
+	EXP_BROKEN,	/* Decoding must fail */
+	EXP_RECLESS,	/* Reconstruction is allowed to yield less data */
+};
+
+static unsigned char buf[4096];
+static int buf_offset;
+
+static int
+_buf_writer(const void *buffer, size_t size, void *app_key) {
+	unsigned char *b, *bend;
+	(void)app_key;
+	assert(buf_offset + size < sizeof(buf));
+	memcpy(buf + buf_offset, buffer, size);
+	b = buf + buf_offset;
+	bend = b + size;
+	printf("=> [");
+	for(; b < bend; b++)
+		printf(" %02X", *b);
+	printf("]:%ld\n", (long)size);
+	buf_offset += size;
+	return 0;
+}
+
+static int
+save_object(T_t *st) {
+	asn_enc_rval_t rval; /* Return value */
+
+	buf_offset = 0;
+	
+	rval = der_encode(&asn1_DEF_T, st, _buf_writer, 0);
+	if (rval.encoded == -1) {
+		fprintf(stderr,
+			"Cannot encode %s: %s\n",
+			rval.failed_type->name, strerror(errno));
+		assert(rval.encoded != -1);
+		return -1;	/* JIC */
+	}
+
+	fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset);
+
+	return 0;
+}
+
+static T_t *
+load_object(enum expectation expectation, char *fbuf, int size) {
+	ber_dec_rval_t rval;
+	T_t *st = 0;
+	int csize;
+
+	fprintf(stderr, "LOADING OBJECT OF SIZE %d\n", size);
+
+	/* Perform multiple iterations with multiple chunks sizes */
+	for(csize = 1; csize < 20; csize += 1) {
+		int fbuf_offset = 0;
+		int fbuf_left = size;
+		int fbuf_chunk = csize;
+
+		if(st) asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+		st = 0;
+
+		do {
+			fprintf(stderr, "Decoding from %d with %d (left %d)\n",
+				fbuf_offset, fbuf_chunk, fbuf_left);
+			rval = ber_decode(&asn1_DEF_T, (void **)&st,
+				fbuf + fbuf_offset,
+					fbuf_chunk < fbuf_left 
+						? fbuf_chunk : fbuf_left);
+			fbuf_offset += rval.consumed;
+			fbuf_left -= rval.consumed;
+			if(rval.code == RC_WMORE)
+				fbuf_chunk += 1;	/* Give little more */
+			else
+				fbuf_chunk = csize;	/* Back off */
+		} while(fbuf_left && rval.code == RC_WMORE);
+
+		if(expectation != EXP_BROKEN) {
+			assert(rval.code == RC_OK);
+		} else {
+			assert(rval.code != RC_OK);
+			fprintf(stderr, "Failed, but this was expected\n");
+			asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+			st = 0;	/* ignore leak for now */
+		}
+	}
+
+	if(st) asn_fprint(stderr, &asn1_DEF_T, st);
+	return st;
+}
+
+
+static void
+process_data(enum expectation expectation, char *fbuf, int size) {
+	T_t *st;
+	int ret;
+
+	st = load_object(expectation, fbuf, size);
+	if(!st) return;
+
+	ret = save_object(st);
+	assert(buf_offset < sizeof(buf));
+	assert(ret == 0);
+
+	if(expectation == EXP_RECLESS) {
+		assert(buf_offset > 0 && buf_offset < size);
+		assert(memcmp(buf + 2, fbuf + 2, buf_offset - 2) == 0);
+	} else {
+		assert(buf_offset == size);
+		assert(memcmp(buf, fbuf, buf_offset) == 0);
+	}
+
+	asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+}
+
+/*
+ * Decode the .der files and try to regenerate them.
+ */
+static int
+process(const char *fname) {
+	char fbuf[4096];
+	char *ext = strrchr(fname, '.');
+	enum expectation expectation;
+	int ret;
+	int rd;
+	FILE *fp;
+
+	if(ext == 0 || strcmp(ext, ".ber"))
+		return 0;
+
+	switch(ext[-1]) {
+	case 'B':	/* The file is intentionally broken */
+		expectation = EXP_BROKEN; break;
+	case 'L':	/* Extensions are present */
+		expectation = EXP_RECLESS; break;
+	default:
+		expectation = EXP_OK; break;
+	}
+
+	fprintf(stderr, "\nProcessing file [../%s]\n", fname);
+
+	ret = chdir("../data-62");
+	assert(ret == 0);
+	fp = fopen(fname, "r");
+	ret = chdir("../test-check-62");
+	assert(ret == 0);
+	assert(fp);
+
+	rd = fread(fbuf, 1, sizeof(fbuf), fp);
+	fclose(fp);
+
+	assert(rd < sizeof(fbuf));	/* expect small files */
+
+	process_data(expectation, fbuf, rd);
+
+	return 1;
+}
+
+int
+main() {
+	DIR *dir;
+	struct dirent *dent;
+	int processed_files = 0;
+
+	dir = opendir("../data-62");
+	assert(dir);
+
+	while((dent = readdir(dir))) {
+		if(strncmp(dent->d_name, "data-62-", 8))
+			continue;
+
+		if(process(dent->d_name))
+			processed_files++;
+	}
+
+	assert(processed_files);
+	closedir(dir);
+
+	return 0;
+}
+
diff --git a/asn1c/tests/data-62/data-62-01.ber b/asn1c/tests/data-62/data-62-01.ber
new file mode 100644
index 0000000..9d0cd7d
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-01.xbr b/asn1c/tests/data-62/data-62-01.xbr
new file mode 100644
index 0000000..18f3e10
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="11">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-02-B.ber b/asn1c/tests/data-62/data-62-02-B.ber
new file mode 100644
index 0000000..288fa2f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.ber
@@ -0,0 +1,2 @@
+0
+¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-02-B.xbr b/asn1c/tests/data-62/data-62-02-B.xbr
new file mode 100644
index 0000000..3d4afbf
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-03-B.ber b/asn1c/tests/data-62/data-62-03-B.ber
new file mode 100644
index 0000000..35271bc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.ber
@@ -0,0 +1 @@
+0	¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-03-B.xbr b/asn1c/tests/data-62/data-62-03-B.xbr
new file mode 100644
index 0000000..50930a6
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-04-B.ber b/asn1c/tests/data-62/data-62-04-B.ber
new file mode 100644
index 0000000..c65a578
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-04-B.xbr b/asn1c/tests/data-62/data-62-04-B.xbr
new file mode 100644
index 0000000..f5b78c3
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-05-B.ber b/asn1c/tests/data-62/data-62-05-B.ber
new file mode 100644
index 0000000..ff65b20
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-05-B.xbr b/asn1c/tests/data-62/data-62-05-B.xbr
new file mode 100644
index 0000000..dd075fc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-06-B.ber b/asn1c/tests/data-62/data-62-06-B.ber
new file mode 100644
index 0000000..530d54b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-06-B.xbr b/asn1c/tests/data-62/data-62-06-B.xbr
new file mode 100644
index 0000000..e5bdfd8
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-07-B.ber b/asn1c/tests/data-62/data-62-07-B.ber
new file mode 100644
index 0000000..286ca58
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-07-B.xbr b/asn1c/tests/data-62/data-62-07-B.xbr
new file mode 100644
index 0000000..9680309
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-08-L.ber b/asn1c/tests/data-62/data-62-08-L.ber
new file mode 100644
index 0000000..d127e08
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-08-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-08-L.xbr b/asn1c/tests/data-62/data-62-08-L.xbr
new file mode 100644
index 0000000..8afad43
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-08-L.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+	<P T="[UNIVERSAL 5]" TL="2" V="0"></P>	-- extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-09-L.ber b/asn1c/tests/data-62/data-62-09-L.ber
new file mode 100644
index 0000000..b7856ca
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-09-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-09-L.xbr b/asn1c/tests/data-62/data-62-09-L.xbr
new file mode 100644
index 0000000..e24ba2c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-09-L.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="16">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+	<P T="[UNIVERSAL 5]" TL="2" V="0"></P>	-- extra component
+	<P T="[UNIVERSAL 1]" TL="2" V="1">&xff;</P>  -- another extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-10.ber b/asn1c/tests/data-62/data-62-10.ber
new file mode 100644
index 0000000..0772c45
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-10.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-10.xbr b/asn1c/tests/data-62/data-62-10.xbr
new file mode 100644
index 0000000..7dd86f0
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-10.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+	<C T="[1]" TL="2" V="5">
+		<I T="[APPLICATION 123]" TL="3" V="Indefinite">
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-11.ber b/asn1c/tests/data-62/data-62-11.ber
new file mode 100644
index 0000000..8eeb0d8
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-11.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-11.xbr b/asn1c/tests/data-62/data-62-11.xbr
new file mode 100644
index 0000000..1ce0695
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-11.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+	<C T="[1]" TL="2" V="8">
+		<I T="[1]" TL="2">
+		</I>
+		<I T="[1]" TL="2">
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-12-B.ber b/asn1c/tests/data-62/data-62-12-B.ber
new file mode 100644
index 0000000..2ea1bdc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.ber
@@ -0,0 +1 @@
+0¡¡€
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-12-B.xbr b/asn1c/tests/data-62/data-62-12-B.xbr
new file mode 100644
index 0000000..b3a370c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+	<C T="[1]" TL="2" V="2">
+		<I T="[1]" TL="2">
+		-- Do not terminate: no end-of-content octets is intended
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-13-B.ber b/asn1c/tests/data-62/data-62-13-B.ber
new file mode 100644
index 0000000..47dc2ac
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-13-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-13-B.xbr b/asn1c/tests/data-62/data-62-13-B.xbr
new file mode 100644
index 0000000..4ee3002
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-13-B.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+	<C T="[1]" TL="2" V="6">
+		<I T="[PRIVATE 1]" TL="2">
+		</I>
+		<I T="[PRIVATE 2]" TL="2">
+		-- Do not terminate: no end-of-content octets is intended.
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-14.ber b/asn1c/tests/data-62/data-62-14.ber
new file mode 100644
index 0000000..c048f28
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-14.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-14.xbr b/asn1c/tests/data-62/data-62-14.xbr
new file mode 100644
index 0000000..0c7da7c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-14.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+	<C T="[1]" TL="2" V="12">
+		<I T="[PRIVATE 1]" TL="2">
+			<I T="[PRIVATE 2]" TL="2">
+			</I>
+			<I T="[PRIVATE 3]" TL="2">
+			</I>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-15-B.ber b/asn1c/tests/data-62/data-62-15-B.ber
new file mode 100644
index 0000000..f87367f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-15-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-15-B.xbr b/asn1c/tests/data-62/data-62-15-B.xbr
new file mode 100644
index 0000000..c57f270
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-15-B.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<I T="[PRIVATE 2]" TL="2">
+			</I>
+			<I T="[PRIVATE 3]" TL="2">
+			-- missing EOC
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-16.ber b/asn1c/tests/data-62/data-62-16.ber
new file mode 100644
index 0000000..799e1e7
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-16.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-16.xbr b/asn1c/tests/data-62/data-62-16.xbr
new file mode 100644
index 0000000..600a6c1
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-16.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-17-B.ber b/asn1c/tests/data-62/data-62-17-B.ber
new file mode 100644
index 0000000..5d98f99
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-17-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-17-B.xbr b/asn1c/tests/data-62/data-62-17-B.xbr
new file mode 100644
index 0000000..4e49f2b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-17-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="5">test2</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-18-B.ber b/asn1c/tests/data-62/data-62-18-B.ber
new file mode 100644
index 0000000..8200bca
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-18-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-18-B.xbr b/asn1c/tests/data-62/data-62-18-B.xbr
new file mode 100644
index 0000000..2177866
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-18-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-19-B.ber b/asn1c/tests/data-62/data-62-19-B.ber
new file mode 100644
index 0000000..1e2641b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-19-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-19-B.xbr b/asn1c/tests/data-62/data-62-19-B.xbr
new file mode 100644
index 0000000..5e424cc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-19-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-20.ber b/asn1c/tests/data-62/data-62-20.ber
new file mode 100644
index 0000000..ea13838
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-20.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-20.xbr b/asn1c/tests/data-62/data-62-20.xbr
new file mode 100644
index 0000000..178fa66
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-20.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<C T="[1]" TL="2" V="7">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="0">
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-21-B.ber b/asn1c/tests/data-62/data-62-21-B.ber
new file mode 100644
index 0000000..d109b4f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-21-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-21-B.xbr b/asn1c/tests/data-62/data-62-21-B.xbr
new file mode 100644
index 0000000..7aeac97
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-21-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<C T="[1]" TL="2" V="7">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="0">
+				<C T="[23]" TL="2" V="0">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-22.ber b/asn1c/tests/data-62/data-62-22.ber
new file mode 100644
index 0000000..93111e9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-22.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-22.xbr b/asn1c/tests/data-62/data-62-22.xbr
new file mode 100644
index 0000000..ca220a7
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-22.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="4">
+				<C T="[23]" TL="2" V="2">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-23-B.ber b/asn1c/tests/data-62/data-62-23-B.ber
new file mode 100644
index 0000000..a1f5af9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-23-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-23-B.xbr b/asn1c/tests/data-62/data-62-23-B.xbr
new file mode 100644
index 0000000..7a2777e
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-23-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="2">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-24-L.ber b/asn1c/tests/data-62/data-62-24-L.ber
new file mode 100644
index 0000000..d88d78b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-24-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-24-L.xbr b/asn1c/tests/data-62/data-62-24-L.xbr
new file mode 100644
index 0000000..9974a67
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-24-L.xbr
@@ -0,0 +1,12 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+	<C T="[1]" TL="2" V="14">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+		<P T="[UNIVERSAL 0]" TL="2" V="0"></P>
+	</C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-25.ber b/asn1c/tests/data-62/data-62-25.ber
new file mode 100644
index 0000000..931978b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-25.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-25.xbr b/asn1c/tests/data-62/data-62-25.xbr
new file mode 100644
index 0000000..d62e456
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-25.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+	<C T="[1]" TL="2" V="12">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-26-B.ber b/asn1c/tests/data-62/data-62-26-B.ber
new file mode 100644
index 0000000..ef7d106
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-26-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-26-B.xbr b/asn1c/tests/data-62/data-62-26-B.xbr
new file mode 100644
index 0000000..13c0aa2
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-26-B.xbr
@@ -0,0 +1,11 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+	<C T="[1]" TL="2" V="14">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+	</C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-27.ber b/asn1c/tests/data-62/data-62-27.ber
new file mode 100644
index 0000000..7cb619d
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-27.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-27.xbr b/asn1c/tests/data-62/data-62-27.xbr
new file mode 100644
index 0000000..2fb6422
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-27.xbr
@@ -0,0 +1,4 @@
+<C T="[UNIVERSAL 16]" TL="2" V="2">
+	<C T="[1]" TL="2" V="0">
+	</C>
+</C>