diff options
author | Jan Beulich <jbeulich@suse.com> | 2023-04-28 08:19:53 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2023-04-28 08:19:53 +0200 |
commit | 2b6132c33c27ea193288507e71d66498614af4f6 (patch) | |
tree | 8c4c4cf0405e411a6412d6eef82dc5527fb83388 /gas/expr.c | |
parent | 1f506c06effab6606e9ca801aa8f9217e9794c35 (diff) | |
download | binutils-2b6132c33c27ea193288507e71d66498614af4f6.zip binutils-2b6132c33c27ea193288507e71d66498614af4f6.tar.gz binutils-2b6132c33c27ea193288507e71d66498614af4f6.tar.bz2 |
gas: move shift count check
... out of mainline code, grouping together the two case labels. This
then also make more obvious that the comment there applies to both forms
of shifts.
Diffstat (limited to 'gas/expr.c')
-rw-r--r-- | gas/expr.c | 28 |
1 files changed, 14 insertions, 14 deletions
@@ -1954,14 +1954,6 @@ expr (int rankarg, /* Larger # is higher rank. */ as_warn (_("division by zero")); v = 1; } - if ((valueT) v >= sizeof(valueT) * CHAR_BIT - && (op_left == O_left_shift || op_left == O_right_shift)) - { - as_warn_value_out_of_range (_("shift count"), v, 0, - sizeof(valueT) * CHAR_BIT - 1, - NULL, 0); - resultP->X_add_number = v = 0; - } switch (op_left) { default: goto general; @@ -1974,6 +1966,7 @@ expr (int rankarg, /* Larger # is higher rank. */ case O_divide: resultP->X_add_number /= v; break; case O_modulus: resultP->X_add_number %= v; break; case O_left_shift: + case O_right_shift: /* We always use unsigned shifts. According to the ISO C standard, left shift of a signed type having a negative value is undefined behaviour, and right @@ -1982,12 +1975,19 @@ expr (int rankarg, /* Larger # is higher rank. */ when the result overflows is also undefined behaviour. So don't trigger ubsan warnings or rely on characteristics of the compiler. */ - resultP->X_add_number - = (valueT) resultP->X_add_number << (valueT) v; - break; - case O_right_shift: - resultP->X_add_number - = (valueT) resultP->X_add_number >> (valueT) v; + if ((valueT) v >= sizeof (valueT) * CHAR_BIT) + { + as_warn_value_out_of_range (_("shift count"), v, 0, + sizeof (valueT) * CHAR_BIT - 1, + NULL, 0); + resultP->X_add_number = 0; + } + else if (op_left == O_left_shift) + resultP->X_add_number + = (valueT) resultP->X_add_number << (valueT) v; + else + resultP->X_add_number + = (valueT) resultP->X_add_number >> (valueT) v; break; case O_bit_inclusive_or: resultP->X_add_number |= v; break; case O_bit_or_not: resultP->X_add_number |= ~v; break; |