Subject: bug#65017: 29.1; Byte compiler interaction with cl-lib function objects, removes symbol-function

From: Alan Mackenzie <[email-masked]>
Date: Thu, 3 Aug 2023 21:10:56 +0000

Hello, Stefan and Mattias.

On Thu, Aug 03, 2023 at 13:30:43 -0400, Stefan Monnier wrote:
> > As I suggested in my other post, it might be a "simple" problem of cache
> > invalidation.  Why is the value from the first compilation hanging around
> > until the second one?

> That's a side problem.  If absolutely needed, we could add some ad-hoc
> invalidation to work around the core problem, but I'd rather fix the
> core problem.

Sorry about my last post.  I now see what the core problem is, namely
that (equal 'equal #<symbol equal at 49>) is returning non-nil.

I think the cause is in internal_equal in src/fns.c, where the following
code appears:

  /* A symbol with position compares the contained symbol, and is
     `equal' to the corresponding ordinary symbol.  */
  if (SYMBOL_WITH_POS_P (o1))
    o1 = SYMBOL_WITH_POS_SYM (o1);
  if (SYMBOL_WITH_POS_P (o2))
    o2 = SYMBOL_WITH_POS_SYM (o2);

This piece of code converts symbols with positions to ordinary symbols
without first checking symbols-with-pos-enabled.  I think this is the
bug.

I will work on a patch to fix it (which shouldn't take long).

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).