I've no real experience with building for Windows so these questions are based 
100% on ignorance. What about building with MSYS2 (and the UNC) or maybe WSL? I 
know that we use cygwin to drive things but my understanding is that we still 
depend on Windows specific SDKs and compilers. Would a pivot to a total MSYS2 
build bypass all that?

I _think_ that that would also allow us to support Win7, but again, I'm not 
exactly sure.

> On Aug 11, 2026, at 1:58 AM, [email protected] wrote:
> 
> Hi Jim, all,
> 
> 
> I switched a bit the target, and try to do a minimal change raise to Win 10 
> with modern compilers.
> As cheap as possible.
> 
> I found following issue:
> 
> *An override may not make a weaker promise about throwing than the thing it 
> overrides* — because a caller holding a base pointer was told "this never 
> throws" and may rely on it.
> 
> Your instinct was close. The adjustment: it's not that the destructor must be 
> /valid/ at every level, it's that the *promise must not get weaker as you go 
> down the chain*.
> 
> What changed in C++11 isn't the rule — it's *who makes the promise*. Under 
> C++03, a destructor with nothing written on it had no promise, so nothing 
> could conflict. From C++11 on, the compiler fills one in, and a class with 
> nothing throwing inside silently gets /"never throws"/. At a class inheriting 
> from both a pre-UNO base and a UNO base, three promises meet and only one was 
> typed by a human — and the compiler's deduced promise for the derived class 
> is weaker than the compiler's deduced promise for the legacy base. It fails 
> in a class where nobody wrote a destructor at all.
> 
> None of these destructors actually throws. It's a paperwork conflict, and the 
> fix emits identical machine code.
> 
> here is an abstract code example:
> 
> struct Legacy            { virtual ~Legacy(); }; // no spec written
> struct Uno               { virtual ~Uno() throw(RuntimeException); };
> struct Both : Legacy, Uno { }; // no destructor at all
> 
> The situation on windows:
> 
> ompiler / mode        |SAL_THROW|expands to   The destructor conflict         
> Forward declaration
> VC9 (C++03)   |throw(exc)|    /doesn't exist/— no implicit promises   accepted
> MSVC 14.29|/std:c++14|        |throw(exc)|    *error C2694*   accepted, 
> silently
> clang, Windows/MSVC target, c++14     |throw(exc)|    *warning*       
> *warning*
> …same, with|-Werror|on that flag      
>       error   error
> clang, Windows/MSVC target, c++17     |throw(exc)|    —       *error: dynamic 
> exception specifications not allowed*
> clang, MinGW target   *nothing*       /doesn't exist/— no specs at all        
> unused
> 
> I forgot what is the floor we have on Apple side.
> 
> For the existing issue i found a solution, to declare the runtime. Which is 
> cheap solution that makes AOO build. But Since i work with C++14 I might miss 
> some language error we might run into.
> does it make sense to change the code to the highest floor Version we need?
> 
> All the best
> 
> Peter
> 

--
Jim
  "This is an outrage!"
                        Tony Harrison

Reply via email to