diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2012-12-21 07:37:33 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-01-08 16:45:22 -0800 |
commit | 8b328d4ee3873bc0a7a34f2cb9d301827244b98c (patch) | |
tree | efd3ffceecea735a6e5c67250b4f5321b459ce80 | |
parent | bd91b05b631f13afd1f7a9d6cbc4f0c5408b523a (diff) |
dix: Make small bitfields that store enums unsigned
Commit 31bf81772e146af79b0c456aae2159eba8b0280f changed the clientState field
from a signed int to a signed int 2-bit bitfield. The ClientState enum that is
expected to be assigned to this field has four values: ClientStateInitial (0),
ClientStateRunning (1), ClientStateRetained (2), and ClientStateGone (3).
However, because this bitfield is signed, ClientStateRetained becomes -2 when
assigned, and ClientStateGone becomes -1. This causes warnings:
test.c:54:10: error: case label value exceeds maximum value for type [-Werror]
test.c:55:10: error: case label value exceeds maximum value for type [-Werror]
The code here is a switch statement:
53 switch (client->clientState) {
54 case ClientStateGone:
55 case ClientStateRetained:
56 [...]
57 break;
58
59 default:
60 [...]
61 break;
62 }
It also causes bizarre problems like this:
client->clientState = ClientStateGone;
assert(client->clientState == ClientStateGone); // this assert fails
Also change the signedness of nearby bitfields to match.
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | include/dixstruct.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/include/dixstruct.h b/include/dixstruct.h index c1236f5c9..678481920 100644 --- a/include/dixstruct.h +++ b/include/dixstruct.h @@ -90,12 +90,12 @@ typedef struct _Client { Mask clientAsMask; short index; unsigned char majorOp, minorOp; - int swapped:1; - int local:1; - int big_requests:1; /* supports large requests */ - int clientGone:1; - int closeDownMode:2; - int clientState:2; + unsigned int swapped:1; + unsigned int local:1; + unsigned int big_requests:1; /* supports large requests */ + unsigned int clientGone:1; + unsigned int closeDownMode:2; + unsigned int clientState:2; char smart_priority; short noClientException; /* this client died or needs to be killed */ int priority; |