summaryrefslogtreecommitdiff
path: root/test-suite
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2018-10-13 23:02:05 -0400
committerMark H Weaver <mhw@netris.org>2018-10-19 21:09:43 -0400
commitc3e14b74e81d0fd3266b97e6bd629cd4e2f98803 (patch)
tree0ed02b5c0eb471cdc692ac13f01ebf2a40321c18 /test-suite
parentc2a654b7d29f5e2f32fd1313cc80162fd0c8f992 (diff)
Fix type inferencing for 'nil?' and 'null?' predicates.
Fixes <https://bugs.gnu.org/33036>. Reported by <calcium@disroot.org>. * module/language/cps/types.scm (define-simple-type-inferrer): Apply (logand (&type val) <>) uniformly. Previously, this was done only in the false branch. Rename local variable to 'type*', to allow the macro operand 'type' to be an arbitrary expression. (*type-inferrers*)<null?>: Add &nil to the set of possible types. (*type-inferrers*)<nil?>: Add &false and &null to the set the possible types. * module/language/cps/type-fold.scm (*branch-folders*)<null?>: Add &nil to the set of possible types. (*branch-folders*)<nil?>: Add &false and &null to the set the possible types. * test-suite/tests/compiler.test: Add tests.
Diffstat (limited to 'test-suite')
-rw-r--r--test-suite/tests/compiler.test51
1 files changed, 50 insertions, 1 deletions
diff --git a/test-suite/tests/compiler.test b/test-suite/tests/compiler.test
index 4f644f339..64bb976fa 100644
--- a/test-suite/tests/compiler.test
+++ b/test-suite/tests/compiler.test
@@ -1,5 +1,5 @@
;;;; compiler.test --- tests for the compiler -*- scheme -*-
-;;;; Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+;;;; Copyright (C) 2008-2014, 2018 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
@@ -251,3 +251,52 @@
(pass-if-equal "test flonum" 0.0 (test-proc #t))
(pass-if-equal "test complex" 0.0+0.0i (test-proc #f)))
+
+(with-test-prefix "null? and nil? inference"
+ (pass-if-equal "nil? after null?"
+ '((f . f) ; 3
+ (f . f) ; #t
+ (f . t) ; #f
+ (t . t) ; #nil
+ (t . t)) ; ()
+ (map (compile '(lambda (x)
+ (if (null? x)
+ (cons 't (if (nil? x) 't 'f))
+ (cons 'f (if (nil? x) 't 'f)))))
+ '(3 #t #f #nil ())))
+
+ (pass-if-equal "nil? after truth test"
+ '((t . f) ; 3
+ (t . f) ; #t
+ (f . t) ; #f
+ (f . t) ; #nil
+ (t . t)) ; ()
+ (map (compile '(lambda (x)
+ (if x
+ (cons 't (if (nil? x) 't 'f))
+ (cons 'f (if (nil? x) 't 'f)))))
+ '(3 #t #f #nil ())))
+
+ (pass-if-equal "null? after nil?"
+ '((f . f) ; 3
+ (f . f) ; #t
+ (t . f) ; #f
+ (t . t) ; #nil
+ (t . t)) ; ()
+ (map (compile '(lambda (x)
+ (if (nil? x)
+ (cons 't (if (null? x) 't 'f))
+ (cons 'f (if (null? x) 't 'f)))))
+ '(3 #t #f #nil ())))
+
+ (pass-if-equal "truth test after nil?"
+ '((f . t) ; 3
+ (f . t) ; #t
+ (t . f) ; #f
+ (t . f) ; #nil
+ (t . t)) ; ()
+ (map (compile '(lambda (x)
+ (if (nil? x)
+ (cons 't (if x 't 'f))
+ (cons 'f (if x 't 'f)))))
+ '(3 #t #f #nil ()))))