From dd8a2a8e29b0dc85dca4d2964c92df3604acc212 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Fri, 12 Jan 2018 10:03:48 -0800 Subject: [PATCH] BUG: Instead of returning garbage, make dtype.descr error for out-of-order fields --- numpy/core/_internal.py | 4 ++++ numpy/core/tests/test_records.py | 13 +++++++++++++ 2 files changed, 17 insertions(+) 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 73cfe35701bc..9461bddc27b4 100644 --- a/numpy/core/tests/test_records.py +++ b/numpy/core/tests/test_records.py @@ -340,6 +340,19 @@ def test_nonwriteable_setfield(self): with assert_raises(ValueError): r.setfield([2,3], *r.dtype.fields['f']) + def test_out_of_order_fields(self): + # names in the same order, padding added to descr + x = self.data[['col1', 'col2']] + assert_equal(x.dtype.names, ('col1', 'col2')) + assert_equal(x.dtype.descr, + [('col1', '