[pypy-commit] cffi default: Complain more readily about opaque enums, by refusing to guess which
arigo
noreply at buildbot.pypy.org
Thu Nov 5 03:08:50 EST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r2373:0fc618efb98b
Date: 2015-11-05 09:09 +0100
http://bitbucket.org/cffi/cffi/changeset/0fc618efb98b/
Log: Complain more readily about opaque enums, by refusing to guess which
integer type (unsigned/signed, int/long) it is meant to be.
diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -514,12 +514,15 @@
if self.baseinttype is not None:
return self.baseinttype.get_cached_btype(ffi, finishlist)
#
+ from . import api
if self.enumvalues:
smallest_value = min(self.enumvalues)
largest_value = max(self.enumvalues)
else:
- smallest_value = 0
- largest_value = 0
+ raise api.CDefError("%r has no values explicitly defined: "
+ "refusing to guess which integer type it is "
+ "meant to be (unsigned/signed, int/long)"
+ % self._get_c_name())
if smallest_value < 0: # needs a signed type
sign = 1
candidate1 = PrimitiveType("int")
diff --git a/testing/cffi0/backend_tests.py b/testing/cffi0/backend_tests.py
--- a/testing/cffi0/backend_tests.py
+++ b/testing/cffi0/backend_tests.py
@@ -1335,7 +1335,8 @@
# these depend on user-defined data, so should not be shared
assert ffi1.typeof("struct foo") is not ffi2.typeof("struct foo")
assert ffi1.typeof("union foo *") is not ffi2.typeof("union foo*")
- assert ffi1.typeof("enum foo") is not ffi2.typeof("enum foo")
+ # the following test is an opaque enum, which we no longer support
+ #assert ffi1.typeof("enum foo") is not ffi2.typeof("enum foo")
# sanity check: twice 'ffi1'
assert ffi1.typeof("struct foo*") is ffi1.typeof("struct foo *")
@@ -1347,6 +1348,14 @@
assert ffi.getctype("pe") == 'e *'
assert ffi.getctype("e1*") == 'e1 *'
+ def test_opaque_enum(self):
+ ffi = FFI(backend=self.Backend())
+ ffi.cdef("enum foo;")
+ e = py.test.raises(CDefError, ffi.cast, "enum foo", -1)
+ assert str(e.value) == (
+ "'enum foo' has no values explicitly defined: refusing to guess "
+ "which integer type it is meant to be (unsigned/signed, int/long)")
+
def test_new_ctype(self):
ffi = FFI(backend=self.Backend())
p = ffi.new("int *")
More information about the pypy-commit
mailing list