mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-03 10:31:37 -08:00
Fix lsh warning shortcomings (bug#56641)
Reported by Basil Contovounesios. * etc/NEWS: Mention how to suppress the warning. * lisp/emacs-lisp/byte-run.el (with-suppressed-warnings): Amend doc string. * lisp/subr.el: Use `macroexp-warn-and-return` to delay the warning until codegen time (which makes it suppressible) and to prevent repeated warnings. * test/lisp/international/ccl-tests.el (shift): * test/src/data-tests.el (data-tests-ash-lsh): Suppress warning in tests of `lsh` itself.
This commit is contained in:
parent
26f4bcc6d7
commit
96926fa6eb
5 changed files with 29 additions and 25 deletions
4
etc/NEWS
4
etc/NEWS
|
|
@ -2336,7 +2336,9 @@ It's been obsolete since Emacs-22.1, actually.
|
||||||
** Calling 'lsh' now elicits a byte-compiler warning.
|
** Calling 'lsh' now elicits a byte-compiler warning.
|
||||||
'lsh' behaves in somewhat surprising and platform-dependent ways for
|
'lsh' behaves in somewhat surprising and platform-dependent ways for
|
||||||
negative arguments, and is generally slower than 'ash', which should be
|
negative arguments, and is generally slower than 'ash', which should be
|
||||||
used instead.
|
used instead. This warning can be suppressed by surrounding calls to
|
||||||
|
'lsh' with the construct '(with-suppressed-warnings ((suspicious lsh)) ...)',
|
||||||
|
but switching to `ash` is generally much preferable.
|
||||||
|
|
||||||
---
|
---
|
||||||
** Some functions and variables obsolete since Emacs 24 have been removed:
|
** Some functions and variables obsolete since Emacs 24 have been removed:
|
||||||
|
|
|
||||||
|
|
@ -672,7 +672,7 @@ types. The types that can be suppressed with this macro are
|
||||||
`suspicious'.
|
`suspicious'.
|
||||||
|
|
||||||
For the `mapcar' case, only the `mapcar' function can be used in
|
For the `mapcar' case, only the `mapcar' function can be used in
|
||||||
the symbol list. For `suspicious', only `set-buffer' can be used."
|
the symbol list. For `suspicious', only `set-buffer' and `lsh' can be used."
|
||||||
;; Note: during compilation, this definition is overridden by the one in
|
;; Note: during compilation, this definition is overridden by the one in
|
||||||
;; byte-compile-initial-macro-environment.
|
;; byte-compile-initial-macro-environment.
|
||||||
(declare (debug (sexp body)) (indent 1))
|
(declare (debug (sexp body)) (indent 1))
|
||||||
|
|
|
||||||
|
|
@ -530,9 +530,8 @@ This function is provided for compatibility. In new code, use `ash'
|
||||||
instead."
|
instead."
|
||||||
(declare (compiler-macro
|
(declare (compiler-macro
|
||||||
(lambda (form)
|
(lambda (form)
|
||||||
(when (byte-compile-warning-enabled-p 'suspicious 'lsh)
|
(macroexp-warn-and-return "avoid `lsh'; use `ash' instead"
|
||||||
(byte-compile-warn-x form "avoid `lsh'; use `ash' instead"))
|
form '(suspicious lsh) t form))))
|
||||||
form)))
|
|
||||||
(when (and (< value 0) (< count 0))
|
(when (and (< value 0) (< count 0))
|
||||||
(when (< value most-negative-fixnum)
|
(when (< value most-negative-fixnum)
|
||||||
(signal 'args-out-of-range (list value count)))
|
(signal 'args-out-of-range (list value count)))
|
||||||
|
|
|
||||||
|
|
@ -25,23 +25,25 @@
|
||||||
|
|
||||||
|
|
||||||
(ert-deftest shift ()
|
(ert-deftest shift ()
|
||||||
;; shift left +ve 5628 #x00000000000015fc
|
(with-suppressed-warnings ((suspicious lsh))
|
||||||
(should (= (ash 5628 8) 1440768)) ; #x000000000015fc00
|
|
||||||
(should (= (lsh 5628 8) 1440768)) ; #x000000000015fc00
|
|
||||||
|
|
||||||
;; shift left -ve -5628 #x3fffffffffffea04
|
;; shift left +ve 5628 #x00000000000015fc
|
||||||
(should (= (ash -5628 8) -1440768)) ; #x3fffffffffea0400
|
(should (= (ash 5628 8) 1440768)) ; #x000000000015fc00
|
||||||
(should (= (lsh -5628 8) -1440768)) ; #x3fffffffffea0400
|
(should (= (lsh 5628 8) 1440768)) ; #x000000000015fc00
|
||||||
|
|
||||||
;; shift right +ve 5628 #x00000000000015fc
|
;; shift left -ve -5628 #x3fffffffffffea04
|
||||||
(should (= (ash 5628 -8) 21)) ; #x0000000000000015
|
(should (= (ash -5628 8) -1440768)) ; #x3fffffffffea0400
|
||||||
(should (= (lsh 5628 -8) 21)) ; #x0000000000000015
|
(should (= (lsh -5628 8) -1440768)) ; #x3fffffffffea0400
|
||||||
|
|
||||||
;; shift right -ve -5628 #x3fffffffffffea04
|
;; shift right +ve 5628 #x00000000000015fc
|
||||||
(should (= (ash -5628 -8) -22)) ; #x3fffffffffffffea
|
(should (= (ash 5628 -8) 21)) ; #x0000000000000015
|
||||||
(should (= (lsh -5628 -8)
|
(should (= (lsh 5628 -8) 21)) ; #x0000000000000015
|
||||||
(ash (- -5628 (ash most-negative-fixnum 1)) -8)
|
|
||||||
(ash (logand (ash -5628 -1) most-positive-fixnum) -7))))
|
;; shift right -ve -5628 #x3fffffffffffea04
|
||||||
|
(should (= (ash -5628 -8) -22)) ; #x3fffffffffffffea
|
||||||
|
(should (= (lsh -5628 -8)
|
||||||
|
(ash (- -5628 (ash most-negative-fixnum 1)) -8)
|
||||||
|
(ash (logand (ash -5628 -1) most-positive-fixnum) -7)))))
|
||||||
|
|
||||||
;; CCl program from `pgg-parse-crc24' in lisp/obsolete/pgg-parse.el
|
;; CCl program from `pgg-parse-crc24' in lisp/obsolete/pgg-parse.el
|
||||||
(defconst prog-pgg-source
|
(defconst prog-pgg-source
|
||||||
|
|
|
||||||
|
|
@ -741,14 +741,15 @@ comparing the subr with a much slower Lisp implementation."
|
||||||
(should (= (ash 1000 (* 2 most-negative-fixnum)) 0))
|
(should (= (ash 1000 (* 2 most-negative-fixnum)) 0))
|
||||||
(should (= (ash -1000 (* 2 most-negative-fixnum)) -1))
|
(should (= (ash -1000 (* 2 most-negative-fixnum)) -1))
|
||||||
(should (= (ash (* 2 most-negative-fixnum) (* 2 most-negative-fixnum)) -1))
|
(should (= (ash (* 2 most-negative-fixnum) (* 2 most-negative-fixnum)) -1))
|
||||||
(should (= (lsh most-negative-fixnum 1)
|
|
||||||
(* most-negative-fixnum 2)))
|
|
||||||
(should (= (ash (* 2 most-negative-fixnum) -1)
|
(should (= (ash (* 2 most-negative-fixnum) -1)
|
||||||
most-negative-fixnum))
|
most-negative-fixnum))
|
||||||
(should (= (lsh most-positive-fixnum -1) (/ most-positive-fixnum 2)))
|
(with-suppressed-warnings ((suspicious lsh))
|
||||||
(should (= (lsh most-negative-fixnum -1) (lsh (- most-negative-fixnum) -1)))
|
(should (= (lsh most-negative-fixnum 1)
|
||||||
(should (= (lsh -1 -1) most-positive-fixnum))
|
(* most-negative-fixnum 2)))
|
||||||
(should-error (lsh (1- most-negative-fixnum) -1)))
|
(should (= (lsh most-positive-fixnum -1) (/ most-positive-fixnum 2)))
|
||||||
|
(should (= (lsh most-negative-fixnum -1) (lsh (- most-negative-fixnum) -1)))
|
||||||
|
(should (= (lsh -1 -1) most-positive-fixnum))
|
||||||
|
(should-error (lsh (1- most-negative-fixnum) -1))))
|
||||||
|
|
||||||
(ert-deftest data-tests-make-local-forwarded-var () ;bug#34318
|
(ert-deftest data-tests-make-local-forwarded-var () ;bug#34318
|
||||||
;; Boy, this bug is tricky to trigger. You need to:
|
;; Boy, this bug is tricky to trigger. You need to:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue