diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-10-09 21:34:43 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-10-09 21:34:43 +0200 |
| commit | 4c78ba2152608563ef3e6eade8c6ebaabcec27b5 (patch) | |
| tree | c30044c5999d7273b53a262a5a8658d2ce36d6f9 | |
| parent | 9870e43ac01895b45c90a01d4ae63bd899cdbb85 (diff) | |
Fix #2122
| -rw-r--r-- | core/strconv/strconv.odin | 9 | ||||
| -rw-r--r-- | tests/issues/test_issue_2087.odin | 6 |
2 files changed, 13 insertions, 2 deletions
diff --git a/core/strconv/strconv.odin b/core/strconv/strconv.odin index ae89722bf..c621ac8e0 100644 --- a/core/strconv/strconv.odin +++ b/core/strconv/strconv.odin @@ -575,9 +575,11 @@ parse_f64 :: proc(str: string, n: ^int = nil) -> (value: f64, ok: bool) { i := 0 sign: f64 = 1 + seen_sign := true switch s[i] { case '-': i += 1; sign = -1 case '+': i += 1 + case: seen_sign = false } for ; i < len(s); i += 1 { @@ -677,8 +679,13 @@ parse_f64 :: proc(str: string, n: ^int = nil) -> (value: f64, ok: bool) { for exp > 0 { scale *= 10; exp -= 1 } } } - s = s[i:] + // If we only consumed a sign, return false + if i == 1 && seen_sign { + return 0, false + } + + s = s[i:] if frac { value = sign * (value/scale) } else { diff --git a/tests/issues/test_issue_2087.odin b/tests/issues/test_issue_2087.odin index 19181bfca..26b6d487d 100644 --- a/tests/issues/test_issue_2087.odin +++ b/tests/issues/test_issue_2087.odin @@ -10,9 +10,13 @@ test_parse_float :: proc(t: ^testing.T) { { f, ok := strconv.parse_f64("1.2") testing.expect(t, ok && f == 1.2, "expected f64(1.2), fully consumed") - f, ok = strconv.parse_f64("1.2a") testing.expect(t, !ok && f == 1.2, "expected f64(1.2), partially consumed") + f, ok = strconv.parse_f64("+") + testing.expect(t, !ok && f == 0.0, "expected f64(0.0), with ok=false") + f, ok = strconv.parse_f64("-") + testing.expect(t, !ok && f == 0.0, "expected f64(0.0), with ok=false") + f, ok = strconv.parse_f64("inf") testing.expect(t, ok && math.classify(f) == math.Float_Class.Inf, "expected f64(+inf), fully consumed") |