diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 3afedf41c..be001bf97 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1571,15 +1571,11 @@ static void class_stmt(bparser *parser) begin_block(parser->finfo, &binfo, 0); bstring *class_str = parser_newstr(parser, "_class"); /* we always define `_class` local variable */ - if (e.type == ETLOCAL) { - bexpdesc e1; /* if inline class, we add a second local variable for _class */ - init_exp(&e1, ETLOCAL, 0); - e1.v.idx = new_localvar(parser, class_str); - be_code_setvar(parser->finfo, &e1, &e, 1); - } else { /* if global class, we just reuse the newly created class in the register */ - init_exp(&e, ETLOCAL, 0); - e.v.idx = new_localvar(parser, class_str); - } + bexpdesc e1; /* if inline class, we add a second local variable for _class */ + init_exp(&e1, ETLOCAL, 0); + e1.v.idx = new_localvar(parser, class_str); + be_code_setvar(parser->finfo, &e1, &e, 1); + begin_varinfo(parser, class_str); class_block(parser, c, &e); diff --git a/lib/libesp32/berry/tests/class_static.be b/lib/libesp32/berry/tests/class_static.be index dbe8c222e..b56c5d282 100644 --- a/lib/libesp32/berry/tests/class_static.be +++ b/lib/libesp32/berry/tests/class_static.be @@ -155,3 +155,12 @@ assert(A.a == 1) assert(A.b == A) assert(A.c == [1, A]) assert(A.f(1) == A) + +# bug when superclass is a member +# the following would break with: +# +# attribute_error: class 'B' cannot assign to static attribute 'aa' +# stack traceback: +# stdin:1: in function `main` +class B end m = module('m') m.B = B +class A : m.B static aa = 1 end