]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix value type inference for doubly negate constraints
authorAndrea Corallo <akrl@sdf.org>
Fri, 18 Dec 2020 17:37:16 +0000 (18:37 +0100)
committerAndrea Corallo <akrl@sdf.org>
Mon, 21 Dec 2020 19:22:03 +0000 (20:22 +0100)
* lisp/emacs-lisp/comp.el (comp-fwprop-insn): Do not propagate in
case of double negation.
* test/src/comp-test-funcs.el (comp-test-assume-double-neg-f):
New function.
* test/src/comp-tests.el (assume-double-neg): New test.

lisp/emacs-lisp/comp.el
test/src/comp-test-funcs.el
test/src/comp-tests.el

index 5d2f8d412fe9d3969ee9d7499072d82899f31e16..895e1ac33e4d6c80a57204e48cccbccc68c3d486 100644 (file)
@@ -2530,7 +2530,9 @@ Fold the call in case."
        (and
         (apply #'comp-cstr-intersection lval operands))
        (not
-        (comp-cstr-negation lval (car operands)))))
+        ;; Prevent double negation!
+        (unless (comp-cstr-neg (car operands))
+          (comp-cstr-negation lval (car operands))))))
     (`(setimm ,lval ,v)
      (setf (comp-mvar-value lval) v))
     (`(phi ,lval . ,rest)
index 5fc032b127d6d09b302ad90c28a9916f971dc0ca..7f70fc2460c70ab91f710b2be84f3c11efefe421 100644 (file)
     (1 " ➊") (2 " ➋") (3 " ➌") (4 " ➍") (5 " ➎") (6 " ➏")
     (7 " ➐") (8 " ➑") (9 " ➒") (10 " ➓") (_ "")))
 
+(defun comp-test-assume-double-neg-f (collection value)
+  ;; Reduced from `auth-source-search-collection'.
+  (when (atom collection)
+    (setq collection (list collection)))
+  (or (eq value t)
+      ;; value is (not (member t))
+      (eq collection value)
+      ;; collection is t, not (member t)!
+      (member value collection)))
+
 \f
 ;;;;;;;;;;;;;;;;;;;;
 ;; Tromey's tests ;;
index 8e069fb3082d74afc9349daa065075d1ecf1f980..eeff599de4c491f32b37619154b470c23cc3b011 100644 (file)
@@ -401,6 +401,10 @@ https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html."
 <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-12/msg01771.html>"
   (should (string= " ➊" (comp-test-45342-f 1))))
 
+(comp-deftest assume-double-neg ()
+  "In fwprop assumtions (not (not (member x))) /= (member x)."
+  (should-not (comp-test-assume-double-neg-f "bar" "foo")))
+
 (defvar comp-test-primitive-advice)
 (comp-deftest primitive-advice ()
   "Test effectiveness of primitive advicing."