check for already existing enum value added; added test (#1453)
* check for already existing enum value added; added test
* added enum value name to exception message
* test for defining enum with multiple identical names moved to test_enum.cpp/py
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index e986d00..8e40c9f 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -1463,7 +1463,10 @@
enum_& value(char const* name, Type value, const char *doc = nullptr) {
auto v = pybind11::cast(value, return_value_policy::copy);
this->attr(name) = v;
- m_entries[pybind11::str(name)] = std::make_pair(v, doc);
+ auto name_converted = pybind11::str(name);
+ if (m_entries.contains(name_converted))
+ throw value_error("Enum error - element with name: " + std::string(name) + " already exists");
+ m_entries[name_converted] = std::make_pair(v, doc);
return *this;
}
diff --git a/tests/test_enum.cpp b/tests/test_enum.cpp
index 4cd14a9..498a00e 100644
--- a/tests/test_enum.cpp
+++ b/tests/test_enum.cpp
@@ -68,4 +68,18 @@
m.def("test_enum_to_int", [](int) { });
m.def("test_enum_to_uint", [](uint32_t) { });
m.def("test_enum_to_long_long", [](long long) { });
+
+ // test_duplicate_enum_name
+ enum SimpleEnum
+ {
+ ONE, TWO, THREE
+ };
+
+ m.def("register_bad_enum", [m]() {
+ py::enum_<SimpleEnum>(m, "SimpleEnum")
+ .value("ONE", SimpleEnum::ONE) //NOTE: all value function calls are called with the same first parameter value
+ .value("ONE", SimpleEnum::TWO)
+ .value("ONE", SimpleEnum::THREE)
+ .export_values();
+ });
}
diff --git a/tests/test_enum.py b/tests/test_enum.py
index c2c272a..a031d95 100644
--- a/tests/test_enum.py
+++ b/tests/test_enum.py
@@ -148,3 +148,9 @@
m.test_enum_to_uint(m.ClassWithUnscopedEnum.EMode.EFirstMode)
m.test_enum_to_long_long(m.Flags.Read)
m.test_enum_to_long_long(m.ClassWithUnscopedEnum.EMode.EFirstMode)
+
+
+def test_duplicate_enum_name():
+ with pytest.raises(ValueError) as excinfo:
+ m.register_bad_enum()
+ assert str(excinfo.value) == "Enum error - element with name: ONE already exists"