Result of shift operation on signed integers is bad.
authorDale Weiler <killfieldengine@gmail.com>
Wed, 29 May 2013 02:24:12 +0000 (02:24 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Wed, 29 May 2013 02:24:12 +0000 (02:24 +0000)
Makefile
gmqcc.h
parser.c

index 01a5dac..d419daa 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -162,7 +162,6 @@ SPLINTFLAGS =            \
     -mayaliasunique      \
     -realcompare         \
     -observertrans       \
-    -shiftnegative       \
     -abstract            \
     -statictrans         \
     -castfcnptr
diff --git a/gmqcc.h b/gmqcc.h
index 2e019a5..3b221e9 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -1163,7 +1163,7 @@ typedef struct {
 
 extern opts_cmd_t opts;
 
-#define OPTS_GENERIC(f,i)    (!! (((f)[(i)/32]) & (1<< ((i)%32))))
+#define OPTS_GENERIC(f,i)    (!! (((f)[(i)/32]) & (1<< (unsigned)((i)%32))))
 #define OPTS_FLAG(i)         OPTS_GENERIC(opts.flags,        (i))
 #define OPTS_WARN(i)         OPTS_GENERIC(opts.warn,         (i))
 #define OPTS_WERROR(i)       OPTS_GENERIC(opts.werror,       (i))
index 4d50bad..da9d33a 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1038,9 +1038,9 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
         case opid2('>','>'):
             if (CanConstFold(exprs[0], exprs[1]) && ! NotSameType(TYPE_FLOAT)) {
                 if (op->id == opid2('<','<'))
-                    out = (ast_expression*)parser_const_float(parser, (double)((int)(ConstF(0)) << (int)(ConstF(1))));
+                    out = (ast_expression*)parser_const_float(parser, (double)((unsigned int)(ConstF(0)) << (unsigned int)(ConstF(1))));
                 else
-                    out = (ast_expression*)parser_const_float(parser, (double)((int)(ConstF(0)) >> (int)(ConstF(1))));
+                    out = (ast_expression*)parser_const_float(parser, (double)((unsigned int)(ConstF(0)) >> (unsigned int)(ConstF(1))));
                 break;
             }
         case opid3('<','<','='):