diff options
-rw-r--r-- | char.c | 5 | ||||
-rw-r--r-- | tokenize.c | 7 | ||||
-rw-r--r-- | validation/empty-char-constant.c | 9 | ||||
-rw-r--r-- | validation/preprocessor/empty-char-constant.c | 13 |
4 files changed, 28 insertions, 6 deletions
@@ -76,6 +76,11 @@ void get_char_constant(struct token *token, unsigned long long *val) case TOKEN_WIDE_CHAR: p = token->string->data; end = p + token->string->length - 1; + if (end == p) { + sparse_error(token->pos, "empty character constant"); + *val = 0; + return; + } break; case TOKEN_CHAR_EMBEDDED_0 ... TOKEN_CHAR_EMBEDDED_3: end = p + type - TOKEN_CHAR; @@ -625,12 +625,7 @@ static int eat_string(int next, stream_t *stream, enum token_type type) warning(stream_pos(stream), "string too long (%d bytes, %d bytes max)", len, MAX_STRING); len = MAX_STRING; } - if (delim == '\'' && len <= 4) { - if (len == 0) { - sparse_error(stream_pos(stream), - "empty character constant"); - return nextchar(stream); - } + if (delim == '\'' && len && len <= 4) { token_type(token) = type + len; memset(buffer + len, '\0', 4 - len); memcpy(token->embedded, buffer, 4); diff --git a/validation/empty-char-constant.c b/validation/empty-char-constant.c new file mode 100644 index 00000000..f674037a --- /dev/null +++ b/validation/empty-char-constant.c @@ -0,0 +1,9 @@ +static int a = ''; + +/* + * check-name: empty-char-constant + * + * check-error-start +empty-char-constant.c:1:16: error: empty character constant + * check-error-end + */ diff --git a/validation/preprocessor/empty-char-constant.c b/validation/preprocessor/empty-char-constant.c new file mode 100644 index 00000000..2c248159 --- /dev/null +++ b/validation/preprocessor/empty-char-constant.c @@ -0,0 +1,13 @@ +#if 0 + '' +#endif + +/* + * check-name: empty-char-constant + * check-command: sparse -E $file + * + * check-output-start + + + * check-output-end + */ |