From: Bruno Haible Date: Sun, 21 May 2017 00:46:18 +0000 (+0200) Subject: argp: Simplify bit manipulation. X-Git-Tag: v1.0~6123 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=88033d3779362aad8fd11345636d9578f94c14d7;p=gnulib.git argp: Simplify bit manipulation. * lib/argp-parse.c (parser_parse_opt): Use &, |, ~ instead of shifts on a signed integer type. --- diff --git a/ChangeLog b/ChangeLog index 8ebdd7b5d0..541952e492 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-05-20 Bruno Haible + + argp: Simplify bit manipulation. + * lib/argp-parse.c (parser_parse_opt): Use &, |, ~ instead of shifts + on a signed integer type. + 2017-05-20 Bruno Haible Avoid wrong configure results with gcc -fsanitize=address. diff --git a/lib/argp-parse.c b/lib/argp-parse.c index 4723a2b29d..fb04a4a2f9 100644 --- a/lib/argp-parse.c +++ b/lib/argp-parse.c @@ -743,15 +743,8 @@ parser_parse_opt (struct parser *parser, int opt, char *val) /* A long option. Preserve the sign in the user key, without invoking undefined behavior. Assume two's complement. */ { - unsigned uopt = opt; - unsigned ushifted_user_key = uopt << GROUP_BITS; - int shifted_user_key = ushifted_user_key; - int user_key; - if (-1 >> 1 == -1) - user_key = shifted_user_key >> GROUP_BITS; - else - user_key = ((ushifted_user_key >> GROUP_BITS) - - (shifted_user_key < 0 ? 1 << USER_BITS : 0)); + int user_key = + ((opt & (1 << (USER_BITS - 1))) ? ~USER_MASK : 0) | (opt & USER_MASK); err = group_parse (&parser->groups[group_key - 1], &parser->state, user_key, parser->opt_data.optarg);