aboutsummaryrefslogtreecommitdiff
path: root/src/tokenizer.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-07-02 20:00:13 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-07-02 20:00:13 -0400
commit6e1425e3123855422068738f0911d5cac9bb0aef (patch)
treefe9e93e40d174bafeb20b74e7da8ed79c562ac19 /src/tokenizer.cpp
parentdd627372660209cc5a8ab294d5811b97cd1f56f5 (diff)
parent06e8c2e5194439ce5b66f18fcf60108604449957 (diff)
downloadzig-6e1425e3123855422068738f0911d5cac9bb0aef.tar.gz
zig-6e1425e3123855422068738f0911d5cac9bb0aef.zip
Merge remote-tracking branch 'origin/master' into llvm7
Diffstat (limited to 'src/tokenizer.cpp')
-rw-r--r--src/tokenizer.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp
index 2950b4eb49..f7f41af8a6 100644
--- a/src/tokenizer.cpp
+++ b/src/tokenizer.cpp
@@ -357,12 +357,19 @@ static void end_float_token(Tokenize *t) {
// Mask the sign bit to 0 since always non-negative lex
const uint64_t exp_mask = 0xffffull << exp_shift;
- if (shift >= 64) {
+ // must be special-cased to avoid undefined behavior on shift == 64
+ if (shift == 128) {
+ f_bits.repr[0] = 0;
+ f_bits.repr[1] = sig_bits[0];
+ } else if (shift == 0) {
+ f_bits.repr[0] = sig_bits[0];
+ f_bits.repr[1] = sig_bits[1];
+ } else if (shift >= 64) {
f_bits.repr[0] = 0;
f_bits.repr[1] = sig_bits[0] << (shift - 64);
} else {
f_bits.repr[0] = sig_bits[0] << shift;
- f_bits.repr[1] = ((sig_bits[1] << shift) | (sig_bits[0] >> (64 - shift)));
+ f_bits.repr[1] = (sig_bits[1] << shift) | (sig_bits[0] >> (64 - shift));
}
f_bits.repr[1] &= ~exp_mask;