GNU bug report logs - #22729
25.0.50; cl-union ignores :test when lists are equal

Previous Next

Package: emacs;

Reported by: Nicolas Richard <youngfrog <at> members.fsf.org>

Date: Thu, 18 Feb 2016 04:16:01 UTC

Severity: normal

Tags: fixed, patch

Found in version 25.0.50

Fixed in version 25.1

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 22729 in the body.
You can then email your comments to 22729 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#22729; Package emacs. (Thu, 18 Feb 2016 04:16:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Nicolas Richard <youngfrog <at> members.fsf.org>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 18 Feb 2016 04:16:02 GMT) Full text and rfc822 format available.

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

From: Nicolas Richard <youngfrog <at> members.fsf.org>
To: bug-gnu-emacs <at> gnu.org
Subject: 25.0.50; cl-union ignores :test when lists are equal
Date: Wed, 17 Feb 2016 09:50:17 +0100
[Message part 1 (text/plain, inline)]
Evaluating
    (cl-union (list "foo") (list "foo") :test 'eql)
returns ("foo") but should return ("foo" "foo") instead.

I suggest the following patch.

[0001-cl-union-should-not-ignore-test-argument-when-lists-.patch (text/x-diff, inline)]
From bece6982ebb9cfc145d45d1c11379133717c947b Mon Sep 17 00:00:00 2001
From: Nicolas Richard <youngfrog <at> members.fsf.org>
Date: Wed, 17 Feb 2016 09:08:03 +0100
Subject: [PATCH] cl-union should not ignore :test argument when lists are
 equal

* cl-seq.el (cl-union): Do not ignore :test argument when lists are equal.

* test/automated/cl-seq-tests.el: New file.
---
 lisp/emacs-lisp/cl-seq.el      |  2 +-
 test/automated/cl-seq-tests.el | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 test/automated/cl-seq-tests.el

diff --git a/lisp/emacs-lisp/cl-seq.el b/lisp/emacs-lisp/cl-seq.el
index 61ee569..21aec6c 100644
--- a/lisp/emacs-lisp/cl-seq.el
+++ b/lisp/emacs-lisp/cl-seq.el
@@ -774,7 +774,7 @@ cl-union
 \nKeywords supported:  :test :test-not :key
 \n(fn LIST1 LIST2 [KEYWORD VALUE]...)"
   (cond ((null cl-list1) cl-list2) ((null cl-list2) cl-list1)
-	((equal cl-list1 cl-list2) cl-list1)
+	((and (not cl-keys) (equal cl-list1 cl-list2)) cl-list1)
 	(t
 	 (or (>= (length cl-list1) (length cl-list2))
 	     (setq cl-list1 (prog1 cl-list2 (setq cl-list2 cl-list1))))
diff --git a/test/automated/cl-seq-tests.el b/test/automated/cl-seq-tests.el
new file mode 100644
index 0000000..f8c8a43
--- /dev/null
+++ b/test/automated/cl-seq-tests.el
@@ -0,0 +1,38 @@
+;;; cl-seq-tests.el --- Tests for cl-seq.el functionality  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015-2016 Free Software Foundation, Inc.
+
+;; Author: Nicolas Richard <youngfrog <at> members.fsf.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-seq)
+
+(ert-deftest cl-union-test-00 ()
+  (let ((str1 "foo")
+        (str2 "foo"))
+    (should (equal (cl-union (list str1) (list str2))
+                   (list str2)))
+    (should (equal (cl-union (list str1) (list str2) :test 'eql)
+                   (list str1 str2)))))
+
+(provide 'cl-seq-tests)
+;;; cl-seq-tests.el ends here
-- 
2.4.5

[Message part 3 (text/plain, inline)]
If ok to apply, on which branch ?


In GNU Emacs 25.0.50.2 (i686-pc-linux-gnu, X toolkit, Xaw scroll bars)
 of 2016-01-17 built on Aurora
Repository revision: a0d5b7ae3bb014bb0b1c205d123c597df0e76411
Windowing system distributor 'The X.Org Foundation', version 11.0.11702000
System Description:	Ubuntu 15.10

Configured using:
 'configure --with-x-toolkit=lucid --enable-checking --with-wide-int
 --cache-file=/tmp/emacs.config.cache 'CFLAGS= -O0 -g3''

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#22729; Package emacs. (Tue, 23 Feb 2016 03:40:01 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Nicolas Richard <youngfrog <at> members.fsf.org>
Cc: 22729 <at> debbugs.gnu.org
Subject: Re: bug#22729: 25.0.50; cl-union ignores :test when lists are equal
Date: Tue, 23 Feb 2016 14:39:02 +1100
Nicolas Richard <youngfrog <at> members.fsf.org> writes:

> * cl-seq.el (cl-union): Do not ignore :test argument when lists are equal.

Thanks; applied.

> * test/automated/cl-seq-tests.el: New file.

The test fails:

   (ert-test-failed
     ((should
       (equal
        (cl-union ... ... :test ...)
        (list str1 str2)))
      :form
      (equal
       ("foo")
       ("foo" "foo"))
      :value nil :explanation
      (proper-lists-of-different-length 1 2
                                        ("foo")
                                        ("foo" "foo")
                                        first-mismatch-at 1)))

And that's because the two "foo" strings are eql here.  Apparently the
Emacs reader is being clever...

I've fixed that by using non-literal strings and applied.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Added tag(s) fixed. Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Tue, 23 Feb 2016 03:40:02 GMT) Full text and rfc822 format available.

bug marked as fixed in version 25.1, send any further explanations to 22729 <at> debbugs.gnu.org and Nicolas Richard <youngfrog <at> members.fsf.org> Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Tue, 23 Feb 2016 03:40:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#22729; Package emacs. (Tue, 23 Feb 2016 17:30:02 GMT) Full text and rfc822 format available.

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

From: Nicolas Richard <youngfrog <at> members.fsf.org>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 22729 <at> debbugs.gnu.org
Subject: Re: bug#22729: 25.0.50; cl-union ignores :test when lists are equal
Date: Tue, 23 Feb 2016 18:26:43 +0100
Lars Ingebrigtsen <larsi <at> gnus.org> writes:
> And that's because the two "foo" strings are eql here.  Apparently the
> Emacs reader is being clever...

I'm surprised because it didn't fail for me.

As a test, this:
    emacs --batch -Q --eval '(let ((str1 "foo") (str2 "foo")) (message "%S" (eql str1 str2)))'
returns nil for me.

Nicolas.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#22729; Package emacs. (Wed, 24 Feb 2016 01:05:02 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Nicolas Richard <youngfrog <at> members.fsf.org>
Cc: 22729 <at> debbugs.gnu.org
Subject: Re: bug#22729: 25.0.50; cl-union ignores :test when lists are equal
Date: Wed, 24 Feb 2016 12:03:24 +1100
Nicolas Richard <youngfrog <at> members.fsf.org> writes:

> Lars Ingebrigtsen <larsi <at> gnus.org> writes:
>> And that's because the two "foo" strings are eql here.  Apparently the
>> Emacs reader is being clever...
>
> I'm surprised because it didn't fail for me.
>
> As a test, this:
>     emacs --batch -Q --eval '(let ((str1 "foo") (str2 "foo")) (message
> "%S" (eql str1 str2)))'
> returns nil for me.

I was surprised, too, but in the ert test the two strings were
definitely eql.  Perhaps ert byte-compiles the functions, and the byte
compiler is doing the clever string thing?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 23 Mar 2016 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 8 years and 281 days ago.

Previous Next


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