Added a warning if the result of a compare operation is constant. This should

protect against missing parenthesis like in (si & 0x7F == 0). Hopefully
without too many false positives.


git-svn-id: svn://svn.cc65.org/cc65/trunk@4057 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz
2009-08-27 22:00:18 +00:00
parent 55e8f67640
commit d65928829f

View File

@@ -1864,17 +1864,17 @@ static void hie_compare (const GenDesc* Ops, /* List of generators */
/* Make sure, the types are compatible */ /* Make sure, the types are compatible */
if (IsClassInt (Expr->Type)) { if (IsClassInt (Expr->Type)) {
if (!IsClassInt (Expr2.Type) && !(IsClassPtr(Expr2.Type) && ED_IsNullPtr(Expr))) { if (!IsClassInt (Expr2.Type) && !(IsClassPtr(Expr2.Type) && ED_IsNullPtr(Expr))) {
Error ("Incompatible types"); Error ("Incompatible types");
} }
} else if (IsClassPtr (Expr->Type)) { } else if (IsClassPtr (Expr->Type)) {
if (IsClassPtr (Expr2.Type)) { if (IsClassPtr (Expr2.Type)) {
/* Both pointers are allowed in comparison if they point to /* Both pointers are allowed in comparison if they point to
* the same type, or if one of them is a void pointer. * the same type, or if one of them is a void pointer.
*/ */
Type* left = Indirect (Expr->Type); Type* left = Indirect (Expr->Type);
Type* right = Indirect (Expr2.Type); Type* right = Indirect (Expr2.Type);
if (TypeCmp (left, right) < TC_EQUAL && left->C != T_VOID && right->C != T_VOID) { if (TypeCmp (left, right) < TC_EQUAL && left->C != T_VOID && right->C != T_VOID) {
/* Incomatible pointers */ /* Incomatible pointers */
Error ("Incompatible types"); Error ("Incompatible types");
} }
} else if (!ED_IsNullPtr (&Expr2)) { } else if (!ED_IsNullPtr (&Expr2)) {
@@ -1885,6 +1885,8 @@ static void hie_compare (const GenDesc* Ops, /* List of generators */
/* Check for const operands */ /* Check for const operands */
if (ED_IsConstAbs (Expr) && rconst) { if (ED_IsConstAbs (Expr) && rconst) {
Warning ("Result of comparison is constant");
/* Both operands are constant, remove the generated code */ /* Both operands are constant, remove the generated code */
RemoveCode (&Mark1); RemoveCode (&Mark1);