Skip to content

Commit e0055d9

Browse files
committed
Fix scoped enum forward declaration bug
The bug was that scoped enums (enum class) were incorrectly generating a `cdef class` forward declaration in the .pxd file, but their actual implementation in the .pyx file was a regular Python `class` inheriting from `_PyEnum`. This mismatch could cause issues in multi-module scenarios. Fix: Only generate `cdef class` forward declarations for unscoped enums, which are actually implemented as `cdef class` in the .pyx file. Scoped enums don't need a forward declaration since they're regular Python classes. Also improved the test to use regex for more precise matching.
1 parent ce2bbd4 commit e0055d9

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

autowrap/CodeGenerator.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -444,16 +444,19 @@ def create_wrapper_for_enum(
444444
stub_code = Code()
445445
enum_pxd_code = Code()
446446

447-
enum_pxd_code.add(
448-
"""
449-
|
450-
|cdef class $name:
451-
| pass
452-
""",
453-
name=name,
454-
)
455-
456447
if not decl.scoped:
448+
# Only generate cdef class forward declaration for unscoped enums,
449+
# since they are implemented as cdef classes in the .pyx file.
450+
# Scoped enums are implemented as regular Python classes (Enum subclasses)
451+
# and should NOT have a cdef class forward declaration.
452+
enum_pxd_code.add(
453+
"""
454+
|
455+
|cdef class $name:
456+
| pass
457+
""",
458+
name=name,
459+
)
457460
code.add(
458461
"""
459462
|

tests/test_code_generator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,10 @@ def test_enum_class_forward_declaration(tmpdir):
572572
# Find if Status is defined as "class Status(_PyEnum)" in pyx
573573
has_python_enum_class = "class Status(_PyEnum)" in enum_module_pyx
574574

575-
# Find if Status has "cdef class Status" forward declaration in pxd
576-
has_cdef_class_forward_decl = "cdef class Status" in enum_module_pxd
575+
# Find if Status has "cdef class Status:" forward declaration in pxd
576+
# Use regex to match exact class name (avoid matching "cdef class StatusHandler")
577+
import re
578+
has_cdef_class_forward_decl = re.search(r"cdef class Status\s*:", enum_module_pxd) is not None
577579

578580
# This is the bug: scoped enums should NOT have cdef class forward declarations
579581
# because they are implemented as regular Python classes (Enum subclasses)

0 commit comments

Comments
 (0)