diff options
author | Jeff Epler <jepler@gmail.com> | 2025-05-28 20:49:29 +0200 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2025-06-10 15:41:24 +1000 |
commit | 2ce63b142068fc04aae701ae78af683736dc179c (patch) | |
tree | bf865a06cdbe96b9a38d3e7fe8b50c52eeec2677 | |
parent | 0a98f3a91130d127c937d6865ead24b6693182eb (diff) |
py/parsenum: Fix parsing complex literals with negative real part.
If a complex literal had a negative real part and a positive imaginary
part, it was not parsed properly because the imaginary part also came out
negative.
Includes a test of complex parsing, which fails without this fix.
Co-authored-by: ComplexSymbol <141301057+ComplexSymbol@users.noreply.github.com>
Signed-off-by: Jeff Epler <jepler@gmail.com>
-rw-r--r-- | py/parsenum.c | 4 | ||||
-rw-r--r-- | tests/float/complex1.py | 2 |
2 files changed, 4 insertions, 2 deletions
diff --git a/py/parsenum.c b/py/parsenum.c index 300b5f28d..7e6695fbf 100644 --- a/py/parsenum.c +++ b/py/parsenum.c @@ -227,13 +227,13 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex const char *top = str + len; mp_float_t dec_val = 0; - bool dec_neg = false; #if MICROPY_PY_BUILTINS_COMPLEX unsigned int real_imag_state = REAL_IMAG_STATE_START; mp_float_t dec_real = 0; -parse_start: +parse_start:; #endif + bool dec_neg = false; // skip leading space for (; str < top && unichar_isspace(*str); str++) { diff --git a/tests/float/complex1.py b/tests/float/complex1.py index f4107a139..0a1d98b9a 100644 --- a/tests/float/complex1.py +++ b/tests/float/complex1.py @@ -12,9 +12,11 @@ print(complex("1.2j")) print(complex("1+j")) print(complex("1+2j")) print(complex("-1-2j")) +print(complex("-1+2j")) print(complex("+1-2j")) print(complex(" -1-2j ")) print(complex(" +1-2j ")) +print(complex(" -1+2j ")) print(complex("nanj")) print(complex("nan-infj")) print(complex(1, 2)) |