Apologies for the non-minimality of the test-case, but this is a smidge weird.
The changes made in b2d25e "Compiler: Improved soundness of the
op-assign optimizer" seem to have broken this:
//Should print ({ }) to stdout and return 0, because the array should
end up empty.
//This is what happens in 7.8 on Windows.
//In the latest 8.0, the first removal fails, so it shows ({ "a" })
and returns 1.
array(string) arr=({"a","b","c"});
int main()
{
add_constant("G",this);
compile_string("void x() {string z=\"a\"; G->arr-=({z});}")()->x();
compile_string("void x() {string z=\"b\"; G->arr=G->arr-({z});}")()->x();
compile_string("void x() {G->arr-=({\"c\"});}")()->x();
write("%O\n",arr);
return sizeof(arr);
}
In theory, the three forms of element removal ought to be equivalent,
but the first one doesn't seem to be functional. I'm afraid the
details are a bit beyond me - the optimizer isn't something I'm
familiar with. All I know is, bisection points to that commit, and
reverting it on top of 8.0 makes the above script work correctly.
Sorry for the vagueness.
ChrisA