From: Mattias EngdegÄrd <mattiase@acm.org>
Date: Sun, 5 Apr 2020 09:27:36 +0000 (+0200)
Subject: Fix inverted NOCOPY encode/decode parameter (bug#40407)
X-Git-Tag: emacs-28.0.90~7648
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=962562cde45071f74a37854a299e88470a4ecd49;p=emacs.git

Fix inverted NOCOPY encode/decode parameter (bug#40407)

In {encode,decode}-coding-string, the NOCOPY parameter had the
opposite effect to what was intended and documented.  This 18 year old
bug (introduced in 4031e2bf0a) only affected calls with CODING-SYSTEM
being nil.

* src/coding.c (code_convert_string): Correct use of NOCOPY.
* test/src/coding-tests.el (coding-nocopy-trivial): New test.
---

diff --git a/src/coding.c b/src/coding.c
index f0fc37dbdfa..1049f1b755a 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -9485,7 +9485,7 @@ code_convert_string (Lisp_Object string, Lisp_Object coding_system,
       if (! norecord)
 	Vlast_coding_system_used = Qno_conversion;
       if (NILP (dst_object))
-	return (nocopy ? Fcopy_sequence (string) : string);
+	return nocopy ? string : Fcopy_sequence (string);
     }
 
   if (NILP (coding_system))
diff --git a/test/src/coding-tests.el b/test/src/coding-tests.el
index 094a1fad8fa..110ff126964 100644
--- a/test/src/coding-tests.el
+++ b/test/src/coding-tests.el
@@ -375,6 +375,14 @@
 			 (with-temp-buffer (insert-file-contents (car file))))))
 	  (insert (format "%s: %s\n" (car file) result)))))))
 
+(ert-deftest coding-nocopy-trivial ()
+  "Check that the NOCOPY parameter works for the trivial coding system."
+  (let ((s "abc"))
+    (should-not (eq (decode-coding-string s nil nil) s))
+    (should (eq (decode-coding-string s nil t) s))
+    (should-not (eq (encode-coding-string s nil nil) s))
+    (should (eq (encode-coding-string s nil t) s))))
+
 ;; Local Variables:
 ;; byte-compile-warnings: (not obsolete)
 ;; End: