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

Reply via email to