diff --git a/lang/cem/cemcom.ansi/LLlex.c b/lang/cem/cemcom.ansi/LLlex.c index 0ea8aa9d6..9f6dfb8eb 100644 --- a/lang/cem/cemcom.ansi/LLlex.c +++ b/lang/cem/cemcom.ansi/LLlex.c @@ -806,7 +806,7 @@ struct token *ptok; fund = LONG; else fund = UNSIGNED; } else if((val & full_mask[(int)long_size]) == val) { - if (val > 0) fund = LONG; + if (val >= 0) fund = LONG; else fund = ULONG; } else { /* sizeof(arith) is greater than long_size */ ASSERT(arith_size > long_size); diff --git a/lang/cem/cemcom.ansi/ival.g b/lang/cem/cemcom.ansi/ival.g index e6c185b0a..9b2760545 100644 --- a/lang/cem/cemcom.ansi/ival.g +++ b/lang/cem/cemcom.ansi/ival.g @@ -582,8 +582,14 @@ ch_array(tpp, ex) else { arith dim = tp->tp_size / tp->tp_up->tp_size; - if (length > dim) { - expr_warning(ex, "too many initialisers"); +#ifdef LINT + if (length == dim + 1) { + expr_warning(ex, "array is not null-terminated"); + } else +#else + if (length > dim + 1) { +#endif + expr_strict(ex, "too many initialisers"); } length = dim; }