]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
-Wframe-macros, warn about duplicate frame macro definitions, on by default
authorWolfgang (Blub) Bumiller <blub@speed.at>
Thu, 23 Aug 2012 17:16:26 +0000 (19:16 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Thu, 23 Aug 2012 17:16:26 +0000 (19:16 +0200)
lexer.c
main.c
warns.def

diff --git a/lexer.c b/lexer.c
index 2798737d200a7b130401ad43ff81804701a28f46..3d217abe3eb574cb252475d3e43fe0f71be1a041 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -27,12 +27,12 @@ void lexerror(lex_file *lex, const char *fmt, ...)
     printf("\n");
 }
 
-void lexwarn(lex_file *lex, int warn, const char *fmt, ...)
+bool lexwarn(lex_file *lex, int warn, const char *fmt, ...)
 {
     va_list ap;
 
     if (!OPTS_WARN(warn))
-        return;
+        return false;
 
     if (lex)
         printf("warning %s:%lu: ", lex->name, (unsigned long)lex->sline);
@@ -44,6 +44,8 @@ void lexwarn(lex_file *lex, int warn, const char *fmt, ...)
     va_end(ap);
 
     printf("\n");
+
+    return opts_werror;
 }
 
 token* token_new()
@@ -398,7 +400,8 @@ static int lex_parse_frame(lex_file *lex)
 static bool lex_finish_frames(lex_file *lex)
 {
     do {
-        int rc;
+        size_t i;
+        int    rc;
         frame_macro m;
 
         rc = lex_parse_frame(lex);
@@ -407,6 +410,15 @@ static bool lex_finish_frames(lex_file *lex)
         if (rc < 0) /* error */
             return false;
 
+        for (i = 0; i < lex->frames_count; ++i) {
+            if (!strcmp(lex->tok->value, lex->frames[i].name)) {
+                lex->frames[i].value = lex->framevalue++;
+                if (lexwarn(lex, WARN_FRAME_MACROS, "duplicate frame macro defined: `%s`", lex->tok->value))
+                    return false;
+                continue;
+            }
+        }
+
         m.value = lex->framevalue++;
         m.name = lex->tok->value;
         lex->tok->value = NULL;
diff --git a/main.c b/main.c
index 544530380b519118f1d2acee4bc99acb8525b084..23f4de8b9294f918b1eb43c75454358a5e4f57b6 100644 (file)
--- a/main.c
+++ b/main.c
@@ -400,6 +400,7 @@ int main(int argc, char **argv) {
     options_set(opts_warn, WARN_VOID_VARIABLES, true);
     options_set(opts_warn, WARN_IMPLICIT_FUNCTION_POINTER, true);
     options_set(opts_warn, WARN_VARIADIC_FUNCTION, true);
+    options_set(opts_warn, WARN_FRAME_MACROS, true);
 
     if (!options_parse(argc, argv)) {
         return usage();
index 3b63b36a6f65c2e29e6c7ac11e53f7b000c68022..b3abd78c68af34a0c4e12e5e4f031edc32d9a01d 100644 (file)
--- a/warns.def
+++ b/warns.def
@@ -15,3 +15,4 @@ GMQCC_DEFINE_FLAG(LOCAL_CONSTANTS)
 GMQCC_DEFINE_FLAG(VOID_VARIABLES)
 GMQCC_DEFINE_FLAG(IMPLICIT_FUNCTION_POINTER)
 GMQCC_DEFINE_FLAG(VARIADIC_FUNCTION)
+GMQCC_DEFINE_FLAG(FRAME_MACROS)