diff --git a/kernel/rtlil.h b/kernel/rtlil.h index e0de79ea9..e36558359 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -805,8 +805,8 @@ public: const_iterator& operator++() { ++idx; return *this; } const_iterator& operator--() { --idx; return *this; } - const_iterator& operator++(int) { ++idx; return *this; } - const_iterator& operator--(int) { --idx; return *this; } + const_iterator operator++(int) { const_iterator result(*this); ++idx; return result; } + const_iterator operator--(int) { const_iterator result(*this); --idx; return result; } const_iterator& operator+=(int i) { idx += i; return *this; } const_iterator operator+(int add) { diff --git a/tests/unit/kernel/rtlilTest.cc b/tests/unit/kernel/rtlilTest.cc index cb773202d..b8ac554b1 100644 --- a/tests/unit/kernel/rtlilTest.cc +++ b/tests/unit/kernel/rtlilTest.cc @@ -90,6 +90,30 @@ namespace RTLIL { } + TEST_F(KernelRtlilTest, ConstConstIteratorWorks) { + const Const c(0x2, 2); + Const::const_iterator it = c.begin(); + ASSERT_NE(it, c.end()); + EXPECT_EQ(*it, State::S0); + ++it; + ASSERT_NE(it, c.end()); + EXPECT_EQ(*it, State::S1); + ++it; + EXPECT_EQ(it, c.end()); + } + + TEST_F(KernelRtlilTest, ConstConstIteratorPreincrement) { + const Const c(0x2, 2); + Const::const_iterator it = c.begin(); + EXPECT_EQ(*++it, State::S1); + } + + TEST_F(KernelRtlilTest, ConstConstIteratorPostincrement) { + const Const c(0x2, 2); + Const::const_iterator it = c.begin(); + EXPECT_EQ(*it++, State::S0); + } + class WireRtlVsHdlIndexConversionTest : public KernelRtlilTest, public testing::WithParamInterface>