From 4aa6e824bb30965bdbd35d46e3e458b7000bc62d Mon Sep 17 00:00:00 2001
From: Ary Borenszweig <aborenszweig@manas.com.ar>
Date: Wed, 29 Oct 2014 18:10:03 -0300
Subject: [PATCH] Fixed an issue with uint64 parsing

---
 spec/compiler/lexer/lexer_spec.cr    | 1 +
 src/compiler/crystal/syntax/lexer.cr | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/spec/compiler/lexer/lexer_spec.cr b/spec/compiler/lexer/lexer_spec.cr
index 3bcbb1c536..cc23045224 100755
--- a/spec/compiler/lexer/lexer_spec.cr
+++ b/spec/compiler/lexer/lexer_spec.cr
@@ -184,6 +184,7 @@ describe "Lexer" do
 
   it_lexes_i64 ["2147483648", "-2147483649", "-9223372036854775808"]
   it_lexes_u64 ["9223372036854775808", "-9223372036854775809"]
+  it_lexes_u64 ["18446744073709551615", "18446744073709551615", "14146167139683460000"]
 
   it_lexes_char "'a'", 'a'
   it_lexes_char "'\\b'", 8.chr
diff --git a/src/compiler/crystal/syntax/lexer.cr b/src/compiler/crystal/syntax/lexer.cr
index a94d8d81b6..7ac78b3d51 100644
--- a/src/compiler/crystal/syntax/lexer.cr
+++ b/src/compiler/crystal/syntax/lexer.cr
@@ -1138,8 +1138,11 @@ module Crystal
       if num_length == 20
         i = 0
         "18446744073709551615".each_byte do |byte|
-          if string_value.byte_at(i) > byte
+          string_byte = string_value.byte_at(i)
+          if string_byte > byte
             raise_value_doesnt_fit_in_uint64 string_value, start
+          elsif string_byte < byte
+            break
           end
           i += 1
         end
-- 
GitLab