fixes

diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index 4643ae2..bf66fe4 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -22,6 +22,7 @@
 static int asn1c_lang_C_type_CHOICE_def(arg_t *arg);
 static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of);
 static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p);
+static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int*tags_impl_skip);
 static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count);
 static int emit_constraint_checking_code(arg_t *arg);
 static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode);
@@ -245,34 +246,17 @@
 	});
 	OUT("};\n");
 
-	p = MKID(expr->Identifier);
-	OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p);
-	INDENTED(
-		if(expr->tag.tag_class) {
-			_print_tag(arg, expr, &expr->tag);
-			if(expr->tag.tag_mode != TM_EXPLICIT)
-				tags_impl_skip++;
-		}
-		if(!expr->tag.tag_class
-		|| (expr->meta_type == AMT_TYPE
-			&& expr->tag.tag_mode == TM_EXPLICIT)) {
-			struct asn1p_type_tag_s tag;
-			if(expr->tag.tag_class)
-				OUT(",\n");
-			tag.tag_class = TC_UNIVERSAL;
-			tag.tag_mode = TM_IMPLICIT;
-			tag.tag_value = expr_type2uclass_value[expr->expr_type];
-			_print_tag(arg, expr, &tag);
-		}
-		OUT("\n");
-	);
-	OUT("};\n");
+	/*
+	 * Print out asn1_DEF_<type>_tags[] vector.
+	 */
+	emit_tags_vector(arg, expr, &tags_impl_skip);
 
 	/*
 	 * Tags to elements map.
 	 */
 	emit_tag2member_map(arg, tag2el, tag2el_count);
 
+	p = MKID(expr->Identifier);
 	OUT("static asn1_SEQUENCE_specifics_t asn1_DEF_%s_specs = {\n", p);
 	INDENTED(
 		OUT("sizeof(struct %s),\n", p);
@@ -306,6 +290,7 @@
 	OUT("};\n");
 	OUT("\n");
 
+	p = MKID(expr->Identifier);
 	REDIR(OT_DEPS);
 	OUT("#include <constr_SEQUENCE.h>\n");
 	OUT("\n");
@@ -483,28 +468,10 @@
 	});
 	OUT("};\n");
 
-	p = MKID(expr->Identifier);
-	OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p);
-	INDENTED(
-		if(expr->tag.tag_class) {
-			_print_tag(arg, expr, &expr->tag);
-			if(expr->tag.tag_mode != TM_EXPLICIT)
-				tags_impl_skip++;
-		}
-		if(!expr->tag.tag_class
-		|| (expr->meta_type == AMT_TYPE
-			&& expr->tag.tag_mode == TM_EXPLICIT)) {
-			struct asn1p_type_tag_s tag;
-			if(expr->tag.tag_class)
-				OUT(",\n");
-			tag.tag_class = TC_UNIVERSAL;
-			tag.tag_mode = TM_IMPLICIT;
-			tag.tag_value = expr_type2uclass_value[expr->expr_type];
-			_print_tag(arg, expr, &tag);
-		}
-		OUT("\n");
-	);
-	OUT("};\n");
+	/*
+	 * Print out asn1_DEF_<type>_tags[] vector.
+	 */
+	emit_tags_vector(arg, expr, &tags_impl_skip);
 
 	/*
 	 * Tags to elements map.
@@ -514,6 +481,7 @@
 	/*
 	 * Emit a map of mandatory elements.
 	 */
+	p = MKID(expr->Identifier);
 	OUT("static uint8_t asn1_DEF_%s_mmap", p);
 	OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements);
 	OUT(" = {\n", p);
@@ -651,29 +619,12 @@
 	);
 	OUT("};\n");
 
-	p = MKID(expr->Identifier);
-	OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p);
-	INDENTED(
-		if(expr->tag.tag_class) {
-			_print_tag(arg, expr, &expr->tag);
-			if(expr->tag.tag_mode != TM_EXPLICIT)
-				tags_impl_skip++;
-		}
-		if(!expr->tag.tag_class
-		|| (expr->meta_type == AMT_TYPE
-			&& expr->tag.tag_mode == TM_EXPLICIT)) {
-			struct asn1p_type_tag_s tag;
-			if(expr->tag.tag_class)
-				OUT(",\n");
-			tag.tag_class = TC_UNIVERSAL;
-			tag.tag_mode = TM_IMPLICIT;
-			tag.tag_value = expr_type2uclass_value[expr->expr_type];
-			_print_tag(arg, expr, &tag);
-		}
-		OUT("\n");
-	);
-	OUT("};\n");
+	/*
+	 * Print out asn1_DEF_<type>_tags[] vector.
+	 */
+	emit_tags_vector(arg, expr, &tags_impl_skip);
 
+	p = MKID(expr->Identifier);
 	OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p);
 	INDENTED(
 		OUT("sizeof(struct %s),\n", p);
@@ -977,29 +928,12 @@
 
 	REDIR(OT_STAT_DEFS);
 
-	p = MKID(expr->Identifier);
-	OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p);
-	INDENTED(
-		if(expr->tag.tag_class) {
-			_print_tag(arg, expr, &expr->tag);
-			if(expr->tag.tag_mode != TM_EXPLICIT)
-				tags_impl_skip++;
-		}
-		if(!expr->tag.tag_class
-		|| (expr->meta_type == AMT_TYPE
-			&& expr->tag.tag_mode == TM_EXPLICIT)) {
-			struct asn1p_type_tag_s tag;
-			if(expr->tag.tag_class)
-				OUT(",\n");
-			tag.tag_class = TC_UNIVERSAL;
-			tag.tag_mode = TM_IMPLICIT;
-			tag.tag_value = expr_type2uclass_value[expr->expr_type];
-			_print_tag(arg, expr, &tag);
-		}
-		OUT("\n");
-	);
-	OUT("};\n");
+	/*
+	 * Print out asn1_DEF_<type>_tags[] vector.
+	 */
+	emit_tags_vector(arg, expr, &tags_impl_skip);
 
+	p = MKID(expr->Identifier);
 	OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p);
 	INDENTED(
 		OUT("\"%s\",\n", expr->Identifier);
@@ -1356,6 +1290,38 @@
 }
 
 static int
+emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip) {
+	char *p;
+
+	p = MKID(expr->Identifier);
+	OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p);
+	INDENTED(
+		if(expr->tag.tag_class) {
+			_print_tag(arg, expr, &expr->tag);
+			if(expr->tag.tag_mode != TM_EXPLICIT)
+				(*tags_impl_skip)++;
+		} else {
+			(*tags_impl_skip)++;
+		}
+		if(!expr->tag.tag_class
+		|| (expr->meta_type == AMT_TYPE
+			&& expr->tag.tag_mode == TM_EXPLICIT)) {
+			struct asn1p_type_tag_s tag;
+			if(expr->tag.tag_class)
+				OUT(",\n");
+			tag.tag_class = TC_UNIVERSAL;
+			tag.tag_mode = TM_IMPLICIT;
+			tag.tag_value = expr_type2uclass_value[expr->expr_type];
+			_print_tag(arg, expr, &tag);
+		}
+		OUT("\n");
+	);
+	OUT("};\n");
+
+	return 0;
+}
+
+static int
 emit_constraint_checking_code(arg_t *arg) {
 	asn1p_expr_t *expr = arg->expr;
 	asn1p_expr_type_e etype;
@@ -1722,7 +1688,7 @@
 		if(ch_start > ch_stop) {
 			WARNING("Empty character range "
 			"alphabet constraint at line %d", ct->_lineno);
-			OUT("#warning Empty character range "
+			OUT_NOINDENT("#warning Empty character range "
 			"alphabet constraint at line %d\n", ct->_lineno);
 			break;
 		}
@@ -1942,9 +1908,12 @@
 			OUT("size = st->size;\n");
 			break;
 		} else {
-			WARNING("Size operation is not defined for %s",
-				ASN_EXPR_TYPE2STR(etype));
-			OUT("#warning Size operation not defined!\n");
+			const char *type_name = ASN_EXPR_TYPE2STR(etype);
+			if(!type_name) type_name = arg->expr->Identifier;
+			WARNING("SIZE constraint is not defined for %s",
+				type_name);
+			OUT_NOINDENT("#warning SIZE constraint "
+				"not defined for %s!\n", type_name);
 			OUT("size = st->size;\n");
 		}
 		return -1;
@@ -2024,6 +1993,6 @@
 _find_terminal_type(arg_t *arg) {
 	asn1p_expr_t *expr;
 	expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL);
-	assert(expr);
-	return expr->expr_type;
+	if(expr) return expr->expr_type;
+	return A1TC_INVALID;
 }
diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h
index 91772cd..31bf697 100644
--- a/libasn1compiler/asn1c_internal.h
+++ b/libasn1compiler/asn1c_internal.h
@@ -62,6 +62,12 @@
 		arg->embed--;			\
 	} while(0)
 #define	OUT(fmt, args...)	asn1c_compiled_output(arg, fmt, ##args)
+#define	OUT_NOINDENT(fmt, args...)	do {	\
+	int _saved_indent = arg->indent_level;	\
+	arg->indent_level = 0;			\
+	asn1c_compiled_output(arg, fmt, ##args);\
+	arg->indent_level = _saved_indent;	\
+} while(0)
 
 #define	REDIR(foo)	do { arg->target->target = foo; } while(0)