Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r69886:2ab068f12ff3
Date: 2014-03-12 08:23 +0100
http://bitbucket.org/pypy/pypy/changeset/2ab068f12ff3/

Log:    Fix shown by test_streamio

diff --git a/rpython/rtyper/rtuple.py b/rpython/rtyper/rtuple.py
--- a/rpython/rtyper/rtuple.py
+++ b/rpython/rtyper/rtuple.py
@@ -290,14 +290,15 @@
         if not s_tup.is_constant():
             raise TyperError("contains() on non-const tuple")
         t = s_tup.const
-        if len(t) == 0:
-            hop.exception_cannot_occur()
-            return hop.inputconst(Bool, False)
+        s_item = hop.args_s[1]
         r_item = hop.args_r[1]
         v_arg = hop.inputarg(r_item, arg=1)
         ll_eq = r_item.get_ll_eq_function() or _ll_equal
         v_result = None
         for x in t:
+            s_const_item = hop.rtyper.annotator.bookkeeper.immutablevalue(x)
+            if not s_item.contains(s_const_item):
+                continue   # corner case, see test_constant_tuple_contains_bug
             c_tuple_item = hop.inputconst(r_item, x)
             v_equal = hop.gendirectcall(ll_eq, v_arg, c_tuple_item)
             if v_result is None:
diff --git a/rpython/rtyper/test/test_rtuple.py 
b/rpython/rtyper/test/test_rtuple.py
--- a/rpython/rtyper/test/test_rtuple.py
+++ b/rpython/rtyper/test/test_rtuple.py
@@ -95,6 +95,14 @@
         res = self.interpret(f, [50])
         assert res is False
 
+    def test_constant_tuple_contains_bug(self):
+        def f(i):
+            return chr(i) in ('1', '2', '34')    # the '34' can never match
+        res = self.interpret(f, [ord('1')])
+        assert res is True
+        res = self.interpret(f, [ord('3')])
+        assert res is False
+
     def test_conv(self):
         def t0():
             return (3, 2, None)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to