diff --git a/numpy/core/_internal.py b/numpy/core/_internal.py index 004c2762b55e..8c6596d131ca 100644 --- a/numpy/core/_internal.py +++ b/numpy/core/_internal.py @@ -110,6 +110,10 @@ def _array_descr(descriptor): num = field[1] - offset result.append(('', '|V%d' % num)) offset += num + elif field[1] < offset: + raise ValueError( + "dtype.descr is not defined for types with overlapping or " + "out-of-order fields") if len(field) > 3: name = (field[2], field[3]) else: diff --git a/numpy/core/tests/test_records.py b/numpy/core/tests/test_records.py index 0a0f8662c17c..f44349096f05 100644 --- a/numpy/core/tests/test_records.py +++ b/numpy/core/tests/test_records.py @@ -356,6 +356,13 @@ def test_nonwriteable_setfield(self): with assert_raises(ValueError): r.setfield([2,3], *r.dtype.fields['f']) + def test_out_of_order_fields(self): + dt = np.dtype({'names': ['a', 'b'], + 'formats': ['i4', 'i4'], + 'offsets': [4, 0]}) + y = np.rec.fromrecords([(1, 2), (4, 5)], dtype=dt) + assert_raises(ValueError, lambda: y.dtype.descr) + def test_pickle_1(self): # Issue #1529 a = np.array([(1, [])], dtype=[('a', np.int32), ('b', np.int32, 0)])