Subject: Re: bug#34525: replace-regexp missing some matches

From: Eli Zaretskii <[email-masked]>
Date: Wed, 27 Feb 2019 18:39:31 +0200

> Date: Wed, 27 Feb 2019 14:22:51 +0000
> Cc: Eli Zaretskii <[email-masked]>, [email-masked],
>   [email-masked]
> From: Alan Mackenzie <[email-masked]>
> 
>   if (! NULL_RIGHT_CHILD (i))
>     {
>       i = i->right;
>       while (! NULL_LEFT_CHILD (i))
>         i = i->left;                  <===============
> 
>       i->position = next_position;
>       return i;
>     }
> 
> Here, in seeking the next interval, we go down a chain of `left's.  We
> do not set the ->position field of these intervals, except for the last
> one, which we return.

The position field is just a cache, isn't it?

> So the returned interval doesn't satisfy the condition that all its
> parents have their ->position's set correctly.  Thus if we use this
> interval as an argument to update_interval, we will likely fail.  I
> think this can happen in update_syntax_table.

next_interval and previous_interval are used extensively, so I'm
having hard time believing that they have such a blatant bug.