aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2022-10-09 21:34:43 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2022-10-09 21:34:43 +0200
commit4c78ba2152608563ef3e6eade8c6ebaabcec27b5 (patch)
treec30044c5999d7273b53a262a5a8658d2ce36d6f9
parent9870e43ac01895b45c90a01d4ae63bd899cdbb85 (diff)
Fix #2122
-rw-r--r--core/strconv/strconv.odin9
-rw-r--r--tests/issues/test_issue_2087.odin6
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")