From 2ce63b142068fc04aae701ae78af683736dc179c Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 28 May 2025 20:49:29 +0200 Subject: [PATCH] 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 --- py/parsenum.c | 4 ++-- tests/float/complex1.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/py/parsenum.c b/py/parsenum.c index 300b5f28de..7e6695fbfc 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 f4107a1390..0a1d98b9af 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))