On 05/18/2013 12:38 AM, Christopher Li wrote: > I guess the rules is that parenthesized string can appear in > any place where string was allowed. I create an incremental patch to address the issue. Please check if that works for you. Chris
diff --git a/symbol.c b/symbol.c index 051a909..a59a4ca 100644 --- a/symbol.c +++ b/symbol.c @@ -284,15 +284,6 @@ static int count_array_initializer(struct symbol *t, struct expression *expr) if (t->ctype.base_type == &int_type && t->ctype.modifiers & MOD_CHAR) is_char = 1; - /* check for a parenthesized string: char x[] = ("string"); */ - if (is_char && expr->type == EXPR_PREOP && expr->op == '(') { - struct expression *e = expr; - while (e && e->type == EXPR_PREOP && e->op == '(') - e = e->unop; - if (e && e->type == EXPR_STRING) - expr = e; - } - switch (expr->type) { case EXPR_INITIALIZER: { struct expression *entry; @@ -305,6 +296,15 @@ static int count_array_initializer(struct symbol *t, struct expression *expr) if (entry->idx_to >= nr) nr = entry->idx_to+1; break; + case EXPR_PREOP: { + struct expression *e = entry; + while (e && e->type == EXPR_PREOP && e->op == '(') + e = e->unop; + if (!(e && e->type == EXPR_STRING)) + break; + entry = e; + /* fall through to strings. */ + } case EXPR_STRING: if (is_char) str_len = entry->string->length; @@ -316,6 +316,15 @@ static int count_array_initializer(struct symbol *t, struct expression *expr) nr = str_len; break; } + case EXPR_PREOP: { + struct expression *e = expr; + while (e && e->type == EXPR_PREOP && e->op == '(') + e = e->unop; + if (!(e && e->type == EXPR_STRING)) + break; + expr = e; + /* fall through to strings. */ + } case EXPR_STRING: if (is_char) nr = expr->string->length; diff --git a/validation/init-char-array1.c b/validation/init-char-array1.c index 7427702..24fd8d8 100644 --- a/validation/init-char-array1.c +++ b/validation/init-char-array1.c @@ -5,6 +5,7 @@ */ static const char u[] = ("hello"); static const char v[] = {"hello"}; +static const char v1[] = {("hello")}; static const char w[] = "hello"; static const char x[5] = "hello"; @@ -21,5 +22,6 @@ static void f(void) * * check-error-start init-char-array1.c:6:26: warning: array initialized from parenthesized string constant +init-char-array1.c:8:28: warning: array initialized from parenthesized string constant * check-error-end */