Yaroslav Halchenko schrieb am 21.09.2015 um 16:26:
> was reported in Debian against 0.23.2 so tried blindly freshier snapshot
> from 0.23.x branch and that one is no go too:
> 
> ======================================================================
> FAIL: large_nums (line 95) (ct_DEF.__test__)
> Doctest: ct_DEF.__test__.large_nums (line 95)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/usr/lib/python2.7/doctest.py", line 2226, in runTest
>     raise self.failureException(self.format_failure(new.getvalue()))
> AssertionError: Failed doctest test for ct_DEF.__test__.large_nums (line 95)
>   File 
> "/tmp/buildd/cython-0.23.2+git12-g2c9d175/build/work-dir/run/cpp/ct_DEF/ct_DEF.so",
>  line unknown line number, in large_nums (line 95)
> 
> ----------------------------------------------------------------------
> File 
> "/tmp/buildd/cython-0.23.2+git12-g2c9d175/build/work-dir/run/cpp/ct_DEF/ct_DEF.so",
>  line ?, in ct_DEF.__test__.large_nums (line 95)
> Failed example:
>     print_large_number(n64)
> Expected:
>     -4294967295
> Got:
>     1

I cannot reproduce this locally (even tried a 32bit docker container), so I
blindly changed a couple of minor things in that branch. Could you give it
another try?

If that didn't help, here is a patch that adds a longness suffix to plain
integer literals based on their type (e.g. found after coercions). I'm not
sure yet if that's really a good idea, but would be helpful to know if it
fixes this test. Could you try both and report back?

Thanks!

Stefan

diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 2984215..230cf47 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -1238,7 +1238,15 @@ class IntNode(ConstNode):
             self.result_code = self.get_constant_c_result_code()
 
     def get_constant_c_result_code(self):
-        return self.value_as_c_integer_string() + self.unsigned + self.longness
+        unsigned, longness = self.unsigned, self.longness
+        literal = self.value_as_c_integer_string()
+        if not (unsigned or longness) and self.type.is_int and literal[0] == '-' and literal[1] != '0':
+            # negative decimal literal => guess longness from type to prevent wrap-around
+            if self.type.rank >= PyrexTypes.c_longlong_type.rank:
+                longness = 'LL'
+            elif self.type.rank >= PyrexTypes.c_long_type.rank:
+                longness = 'L'
+        return literal + unsigned + longness
 
     def value_as_c_integer_string(self):
         value = self.value
_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to