GNU bug report logs -
#46843
28.0.50; [native-comp] (lambda (x) (if (equal x b) (eq x b) (error ""))) miscompiled
Previous Next
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):
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.