On Monday 09 February 2026 14:48:12 Martin Storsjö wrote:
> On Fri, 16 Jan 2026, LIU Hao wrote:
>
> > 在 2026-1-16 17:58, Martin Storsjö 写道:
> > > That does fix the errors for returning this value, but it still
> > > doesn't help with the case for the switch case:
> > >
> > > /home/martin/code/llvm-mingw/llvm-project/libunwind/src/Unwind-seh.cpp:272:8:
> > > error: case value is not a constant expression
> > > 272 | case EXCEPTION_DISPOSITION(4):
> > > | ^~~~~~~~~~~~~~~~~~~~~~~~
> > >
> > > /home/martin/code/llvm-mingw/llvm-project/libunwind/src/Unwind-seh.cpp:272:8:
> > > error: case value is not a constant expression
> > > 272 | case static_cast<EXCEPTION_DISPOSITION>(4):
> > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Actually - in the original form, with just "case 4:", this isn't an error,
> just a warning:
>
> llvm-project/libunwind/src/Unwind-seh.cpp:272:8: warning: case value not in
> enumerated type 'EXCEPTION_DISPOSITION' (aka 'enum _EXCEPTION_DISPOSITION')
> [-Wswitch]
> 272 | case 4 /*ExceptionExecuteHandler*/:
> | ^
>
> So theoretically we could just change the return values, but ignore this
> one. But while we don't build libunwind with -Werror anywhere, we don't want
> to add new known warnings anyway...
>
>
> > I think it's because the underlying type of `EXCEPTION_DISPOSITION` is
> > not fixed, and Clang somehow allocates `unsigned int:2` for it, which is
> > not sufficient for the value 4.
>
> No, that's not quite it.
>
> > or declare a fixed underlying type
> >
> > typedef enum _EXCEPTION_DISPOSITION
> > #if defined __cplusplus && __cplusplus >= 201103L
> > : int
> > #endif
> > {
> > ExceptionContinueExecution = 0,
> > ExceptionContinueSearch = 1,
> > ExceptionNestedException = 2,
> > ExceptionCollidedUnwind = 3
> > } EXCEPTION_DISPOSITION;
>
> This doesn't make any difference
>
> > To work around that, we can either declare a placeholder value
> >
> > typedef enum _EXCEPTION_DISPOSITION {
> > ExceptionContinueExecution = 0,
> > ExceptionContinueSearch = 1,
> > ExceptionNestedException = 2,
> > ExceptionCollidedUnwind = 3,
> > __EXCEPTION_DISPOSITION_placeholder_for_libunwind = 4
> > } EXCEPTION_DISPOSITION;
>
> This one actually works; presumably because "case 4" works as there _is_ a
> known enum element with value 4, even though it's just a placeholder.
>
> But ideally we shouldn't really need to go this way...
>
>
> > Another option would be to change the switch in Unwind-seh.cpp from
> >
> > switch (ms_act) {
> >
> > To
> >
> > switch (int(ms_act)) {
> >
> > And then the switch can use either enum values or raw integer numbers.
>
> Yes, this one actually works fine.
>
> I proposed a fix for libunwind in
> https://github.com/llvm/llvm-project/pull/180513 to fix these issues.
>
> // Martin
Thank you for taking care of this. I see that pull request was already
merged. So I think that this should finally solve opened issues
regarding this enum.
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public