aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--parse.c28
-rw-r--r--symbol.h2
-rw-r--r--validation/abstract-array-declarator-quals.c1
3 files changed, 11 insertions, 20 deletions
diff --git a/parse.c b/parse.c
index 182f4ad3..ec69e0c6 100644
--- a/parse.c
+++ b/parse.c
@@ -171,7 +171,7 @@ static struct symbol_op register_op = {
};
static struct symbol_op static_op = {
- .type = KW_MODIFIER,
+ .type = KW_MODIFIER|KW_STATIC,
.declarator = static_specifier,
};
@@ -1721,28 +1721,20 @@ static struct token *declaration_specifiers(struct token *token, struct decl_sta
return token;
}
-static struct token *abstract_array_static_declarator(struct token *token, int *has_static)
-{
- while (token->ident == &static_ident) {
- if (*has_static)
- sparse_error(token->pos, "duplicate array static declarator");
-
- *has_static = 1;
- token = token->next;
- }
- return token;
-
-}
-
static struct token *abstract_array_declarator(struct token *token, struct symbol *sym)
{
struct expression *expr = NULL;
int has_static = 0;
- token = abstract_array_static_declarator(token, &has_static);
-
- if (match_idents(token, &restrict_ident, &__restrict_ident, &__restrict___ident, NULL))
- token = abstract_array_static_declarator(token->next, &has_static);
+ while (token_type(token) == TOKEN_IDENT) {
+ struct symbol *sym = lookup_keyword(token->ident, NS_TYPEDEF);
+ if (!sym || !(sym->op->type & (KW_STATIC|KW_QUALIFIER)))
+ break;
+ if (has_static && (sym->op->type & KW_STATIC))
+ sparse_error(token->pos, "duplicate array static declarator");
+ has_static |= (sym->op->type & KW_STATIC);
+ token = token->next;
+ }
token = assignment_expression(token, &expr);
sym->array_size = expr;
return token;
diff --git a/symbol.h b/symbol.h
index c2b60ce9..14730648 100644
--- a/symbol.h
+++ b/symbol.h
@@ -81,7 +81,7 @@ enum keyword {
KW_BUILTIN = 1 << 4,
KW_ASM = 1 << 5,
KW_MODE = 1 << 6,
- // KW UNUSED = 1 << 7,
+ KW_STATIC = 1 << 7,
// KW UNUSED = 1 << 8,
KW_EXACT = 1 << 9,
};
diff --git a/validation/abstract-array-declarator-quals.c b/validation/abstract-array-declarator-quals.c
index 85a35a2a..e69df902 100644
--- a/validation/abstract-array-declarator-quals.c
+++ b/validation/abstract-array-declarator-quals.c
@@ -18,5 +18,4 @@ void ok7(int a[const volatile restrict static N]);
/*
* check-name: abstract-array-declarator-quals
- * check-known-to-fail
*/