mixed `->foo() {} void `->=foo(mixed v) {}
created a virtual symbol foo in the class are now replaced with
mixed `foo() {} void `=foo(mixed v) {}
The setter syntaxes above are incorrect. They should read `->foo= and `foo=, respectively.
mapping m = ([ "x" : 0, "y" : UNDEFINED, ]); zero_type( m->x ); // This should be 0 zero_type( m->y ); // This should be 1 zero_type( m->z ); // This should be 1 has_index( m, "x" ); // This should be 1 has_index( m, "y" ); // This should be 1 has_index( m, "z" ); // This should be 0 Here the expression m->y will return 0 with zero type 0. This is due to all subtype flags being cleared by the mapping. For symmetry with with the object case this was agreed to to be changed.
Agreed upon, indeed? That's news to me. I object to this strongly, since it effectively and completely defeats the purpose of UNDEFINED. We could just as well remove it completely instead. That'd make one less zero type, at least.
The object case might be justified to keep since one can just as well use has_index, but not this.
A possibility is maybe that
a->b = UNDEFINED;
actually removed the index "b" from the mapping a, but even that is dubious for compatibility reasons (places where this change would break stuff are very difficult to locate).