@@ -474,22 +474,49 @@ def test_wrap_ignore_foreign_cimports():
474474
475475def test_enum_class_forward_declaration (tmpdir ):
476476 """
477- Test that scoped enums (enum class) do NOT generate incorrect forward declarations.
477+ Regression test: Scoped enums (enum class) must not generate cdef class forward declarations.
478478
479- This test exposes a bug where scoped enums generate a `cdef class` forward declaration
480- in the .pxd file, but the actual implementation in the .pyx file is a regular Python
481- `class` inheriting from `_PyEnum`. This mismatch can cause Cython compilation failures
482- when another module cimports the enum.
479+ Background
480+ ----------
481+ When wrapping a C++ scoped enum (enum class) for use across multiple Python extension
482+ modules, autowrap generates two files:
483483
484- The issue:
485- - PXD file generates: `cdef class Status: pass`
486- - PYX file generates: `class Status(_PyEnum): ...`
484+ 1. A .pxd file (Cython declaration file) - used by other modules to cimport symbols
485+ 2. A .pyx file (Cython implementation file) - contains the actual Python wrapper code
487486
488- These are incompatible - you can't have a cdef class forward declaration
489- that is implemented by a regular Python class.
487+ The Bug
488+ -------
489+ Previously, autowrap generated a `cdef class` forward declaration in the .pxd file
490+ for ALL enums, including scoped enums. However, scoped enums are implemented as
491+ regular Python classes (inheriting from Python's Enum), not as Cython extension types.
490492
491- When write_pxd is True (multi-module scenario), another module doing
492- `from EnumModule cimport Status` would expect a cdef class but get a Python class.
493+ This caused a type mismatch:
494+ - .pxd file declared: `cdef class Status: pass` (Cython extension type)
495+ - .pyx file defined: `class Status(_PyEnum): ...` (Python class)
496+
497+ Impact
498+ ------
499+ In multi-module scenarios, when Module B tries to use an enum defined in Module A:
500+
501+ # In Module B's .pyx file
502+ from ModuleA cimport Status # Expects cdef class, gets Python class
503+
504+ This mismatch could cause Cython compilation errors or runtime issues.
505+
506+ The Fix
507+ -------
508+ Only generate `cdef class` forward declarations for unscoped enums (which ARE
509+ implemented as cdef classes). Scoped enums don't need forward declarations in
510+ the .pxd file since they're regular Python classes.
511+
512+ Test Setup
513+ ----------
514+ This test creates a two-module scenario:
515+ - EnumModule: Defines a scoped enum `Status` and a class `StatusHandler`
516+ - ConsumerModule: Uses the `Status` enum from EnumModule
517+
518+ The test verifies that no `cdef class Status:` forward declaration is generated
519+ in the .pxd file when `Status` is a scoped enum implemented as a Python Enum class.
493520 """
494521 import shutil
495522 import subprocess
0 commit comments