Add unittest, which revealed that default booleans were not set properly
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index d75d73c..e9f4f3a 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -2585,7 +2585,9 @@
case ASN_BASIC_INTEGER:
case ASN_BASIC_ENUMERATED:
if(expr->marker.default_value == NULL
- || expr->marker.default_value->type != ATV_INTEGER)
+ || (expr->marker.default_value->type != ATV_INTEGER &&
+ expr->marker.default_value->type != ATV_TRUE &&
+ expr->marker.default_value->type != ATV_FALSE))
break;
if(!fits_long)
fits_long = asn1c_type_fits_long(arg, expr)!=FL_NOTFIT;
diff --git a/tests/tests-asn1c-compiler/148-der-default-set-sequence-values-OK.asn1 b/tests/tests-asn1c-compiler/148-der-default-set-sequence-values-OK.asn1
new file mode 100644
index 0000000..f4576c6
--- /dev/null
+++ b/tests/tests-asn1c-compiler/148-der-default-set-sequence-values-OK.asn1
@@ -0,0 +1,22 @@
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .148
+
+ModuleTestDerSetSequenceValues
+ { iso org(3) dod(6) internet(1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 148 }
+DEFINITIONS AUTOMATIC TAGS ::= BEGIN
+
+ DefaultSequence ::= SEQUENCE {
+ aBool BOOLEAN DEFAULT FALSE,
+ anInteger INTEGER OPTIONAL
+ }
+
+ DefaultSet ::= SET {
+ aBool [0] IMPLICIT BOOLEAN DEFAULT FALSE,
+ anInteger [1] IMPLICIT INTEGER OPTIONAL
+ }
+
+END
diff --git a/tests/tests-c-compiler/Makefile.am b/tests/tests-c-compiler/Makefile.am
index 7112cc5..314903a 100644
--- a/tests/tests-c-compiler/Makefile.am
+++ b/tests/tests-c-compiler/Makefile.am
@@ -28,6 +28,7 @@
TESTS += check-src/check-132.-gen-PER.c
TESTS += check-src/check-133.-gen-PER.c
TESTS += check-src/check-135.-gen-OER.c
+TESTS += check-src/check-148.c
TESTS += check-src/check-19.c
TESTS += check-src/check-22.-fwide-types.c
TESTS += check-src/check-24.-fwide-types.c
diff --git a/tests/tests-c-compiler/check-src/check-148.c b/tests/tests-c-compiler/check-src/check-148.c
new file mode 100644
index 0000000..f19a110
--- /dev/null
+++ b/tests/tests-c-compiler/check-src/check-148.c
@@ -0,0 +1,175 @@
+#undef NDEBUG
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+#include <assert.h>
+
+#include <DefaultSequence.h>
+#include <DefaultSet.h>
+
+uint8_t berSeq1[] = {
+ 32 | 16, /* [UNIVERSAL 16], constructed */
+ 6, /* L */
+ /* aBool BOOLEAN */
+ ((2 << 6) + 0), /* [0], primitive */
+ 1, /* L */
+ 0, /* FALSE */
+ /* anInteger INTEGER */
+ ((2 << 6) + 1), /* [1], primitive */
+ 1, /* L */
+ 1
+};
+
+uint8_t derSeq1[] = {
+ 32 | 16, /* [UNIVERSAL 16], constructed */
+ 3, /* L */
+ /* anInteger INTEGER */
+ ((2 << 6) + 1), /* [1], primitive */
+ 1, /* L */
+ 1
+};
+
+uint8_t berSeq2[] = {
+ 32 | 16, /* [UNIVERSAL 16], constructed */
+ 3, /* L */
+ /* aBool BOOLEAN */
+ ((2 << 6) + 0), /* [0], primitive */
+ 1, /* L */
+ 0 /* FALSE */
+};
+
+uint8_t derSeq2[] = {
+ 32 | 16, /* [UNIVERSAL 16], constructed */
+ 0 /* L */
+};
+
+uint8_t berSet1[] = {
+ 32 | 17, /* [UNIVERSAL 17], constructed */
+ 6, /* L */
+ /* aBool BOOLEAN */
+ ((2 << 6) + 0), /* [0], primitive */
+ 1, /* L */
+ 0, /* FALSE */
+ /* anInteger INTEGER */
+ ((2 << 6) + 1), /* [1], primitive */
+ 1, /* L */
+ 1
+};
+
+uint8_t derSet1[] = {
+ 32 | 17, /* [UNIVERSAL 17], constructed */
+ 3, /* L */
+ /* anInteger INTEGER */
+ ((2 << 6) + 1), /* [1], primitive */
+ 1, /* L */
+ 1
+};
+
+uint8_t berSet2[] = {
+ 32 | 17, /* [UNIVERSAL 17], constructed */
+ 3, /* L */
+ /* aBool BOOLEAN */
+ ((2 << 6) + 0), /* [0], primitive */
+ 1, /* L */
+ 0 /* FALSE */
+};
+
+uint8_t derSet2[] = {
+ 32 | 17, /* [UNIVERSAL 17], constructed */
+ 0 /* L */
+};
+
+uint8_t buf2[128];
+int buf2_pos;
+
+static int
+buf2_fill(const void *buffer, size_t size, void *app_key) {
+
+ (void)app_key;
+
+ if(buf2_pos + size > sizeof(buf2))
+ return -1;
+
+ memcpy(buf2 + buf2_pos, buffer, size);
+ buf2_pos += size;
+
+ return 0;
+}
+
+static void
+compare_encoding(asn_enc_rval_t *erval, uint8_t *expected, size_t expected_size,
+ uint8_t *actual) {
+ int i;
+
+ assert(erval->encoded != -1);
+ if(erval->encoded != expected_size) {
+ printf("%d != %d\n", (int)erval->encoded, (int)expected_size);
+ }
+ assert(erval->encoded == (ssize_t)expected_size);
+ for(i = 0; i < expected_size; i++) {
+ if(expected[i] != actual[i]) {
+ fprintf(stderr, "Recreated buffer content mismatch:\n");
+ fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n",
+ i,
+ expected[i], actual[i],
+ expected[i], actual[i]
+ );
+ }
+ assert(expected[i] == actual[i]);
+ }
+}
+
+static void
+check_sequence(uint8_t *in, size_t in_size, uint8_t *expected,
+ size_t expected_size) {
+ DefaultSequence_t t, *tp;
+ void *tpp = &tp;
+ asn_dec_rval_t rval;
+ asn_enc_rval_t erval;
+
+ tp = memset(&t, 0, sizeof(t));
+
+ /* Try to decode the BER encoding. */
+ rval = ber_decode(0, &asn_DEF_DefaultSequence, (void**)tpp, in, in_size);
+ assert(rval.code == RC_OK);
+ assert(rval.consumed == in_size);
+
+ /* Try to re-create using DER encoding. */
+ buf2_pos = 0;
+ erval = der_encode(&asn_DEF_DefaultSequence, tp, buf2_fill, 0);
+ compare_encoding(&erval, expected, expected_size, buf2);
+}
+
+static void
+check_set(uint8_t *in, size_t in_size, uint8_t *expected,
+ size_t expected_size) {
+ DefaultSet_t t, *tp;
+ void *tpp = &tp;
+ asn_dec_rval_t rval;
+ asn_enc_rval_t erval;
+
+ tp = memset(&t, 0, sizeof(t));
+
+ /* Try to decode the BER encoding. */
+ rval = ber_decode(0, &asn_DEF_DefaultSet, (void**)tpp, in, in_size);
+ assert(rval.code == RC_OK);
+ assert(rval.consumed == in_size);
+
+ /* Try to re-create using DER encoding. */
+ buf2_pos = 0;
+ erval = der_encode(&asn_DEF_DefaultSet, tp, buf2_fill, 0);
+ compare_encoding(&erval, expected, expected_size, buf2);
+}
+
+int
+main(int ac, char **av) {
+
+ (void)ac; /* Unused argument */
+ (void)av; /* Unused argument */
+
+ check_sequence(berSeq1, sizeof(berSeq1), derSeq1, sizeof(derSeq1));
+ check_sequence(berSeq2, sizeof(berSeq2), derSeq2, sizeof(derSeq2));
+ check_set(berSet1, sizeof(berSet1), derSet1, sizeof(derSet1));
+ check_set(berSet2, sizeof(berSet2), derSet2, sizeof(derSet2));
+}