From 937a4588eca918a0bfac82e5c0f42adc0d2807c8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 12 Jun 2008 23:29:01 +0000 Subject: [PATCH] Handling duplicate storage class specifiers --- src/code.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/code.c b/src/code.c index 94555ed..4b7ee46 100644 --- a/src/code.c +++ b/src/code.c @@ -466,22 +466,34 @@ int code_context_set_identifier(Code * code, char const * identifier) /* code_context_set_storage */ int code_context_set_storage(Code * code, CodeStorage storage) { -#ifdef DEBUG - char const * str[CODE_STORAGE_COUNT] = + struct { - "NULL", - "TYPEDEF", - "EXTERN", - "STATIC", - "AUTO", - "REGISTER" + CodeStorage storage; + char const * name; + } sn[CODE_STORAGE_COUNT] = + { + { CODE_STORAGE_NULL, "NULL" }, + { CODE_STORAGE_TYPEDEF, "typedef" }, + { CODE_STORAGE_EXTERN, "extern" }, + { CODE_STORAGE_STATIC, "static" }, + { CODE_STORAGE_AUTO, "auto" }, + { CODE_STORAGE_REGISTER,"register" } }; + size_t i; +#ifdef DEBUG fprintf(stderr, "DEBUG: %s(%s)\n", __func__, str[storage]); #endif - /* FIXME should probably warn if already set */ - code->storage |= storage; - return 0; + if(!(code->storage & storage)) + { + code->storage |= storage; + return 0; + } + for(i = 0; i < CODE_STORAGE_COUNT; i++) + if(sn[i].storage == storage) + return error_set_code(1, "%s\"%s\"", "Duplicate ", + sn[i].name); + return error_set_code(1, "%s", "Duplicate storage class specifier"); }