GNU bug report logs - #46843
28.0.50; [native-comp] (lambda (x) (if (equal x b) (eq x b) (error ""))) miscompiled

Previous Next

Package: emacs;

Reported by: Pip Cet <pipcet <at> gmail.com>

Date: Mon, 1 Mar 2021 06:53:02 UTC

Severity: normal

Found in version 28.0.50

Done: Andrea Corallo <akrl <at> sdf.org>

Bug is archived. No further changes may be made.

Full log


Message #8 received at 46843 <at> debbugs.gnu.org (full text, mbox):

From: Pip Cet <pipcet <at> gmail.com>
To: 46843 <at> debbugs.gnu.org
Subject: Re: bug#46843: 28.0.50; [native-comp] (lambda (x) (if (equal x b) (eq
 x b) (error ""))) miscompiled
Date: Mon, 1 Mar 2021 08:08:42 +0000
On Mon, Mar 1, 2021 at 6:53 AM Pip Cet <pipcet <at> gmail.com> wrote:
>
> In *scratch*, evaluate
>
> (funcall
>  (let* ((lexical-binding t)
>         (a (list 'a))
>         (b (cons a a)))
>    (native-compile
>     `(lambda (x) (if (equal x ',b) (eq x ',b) (error "")))))
>  '((a) a))

The same issue applies to eql. However, I had to convince myself first
that there is valid and useful code that keeps track of the eq-uality
of eql floats. There is, because there might be an eq-based hash table
that uses them.

(funcall
 (let* ((canonical-one 1.0)
        (hash (make-hash-table :test 'eq)))
   (puthash canonical-one t hash)
   (let* ((is-canonical-one
           `(lambda (x) (if (eql x ,canonical-one) (eq x
,canonical-one) (error "")))))
     (setq is-canonical-one (native-compile is-canonical-one))
     `(lambda (x) (if (funcall ',is-canonical-one x) (cl-assert
(gethash x ',hash))))))
 1.0)

is miscompiled to code that causes an assertion violation when it
actually is correct code that verifies, in two different ways, that x
is eq to a canonical float representing 1.0.
Pip




This bug report was last modified 4 years and 164 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.