Destructors and noexcept

c++, c++11, destructor, noexcept

Solution

This is a known bug (credits to the OP for finding the bug report), and it seems it has been fixed in GCC 4.8.0. For instance, the static assertion below will fire on GCC 4.7.2, but not on GCC 4.8.0:

struct X
{
    ~X() { };
};

int main()
{
    X x;

    // This will not fire even in GCC 4.7.2 if the destructor is
    // explicitly marked as noexcept(true)
    static_assert(noexcept(x.~X()), "Ouch!");
}

Problem

I am a little bit confused with destructors and `noexcept`. My understanding was that in C++11 any destructor, including user-defined, is implicitly `noexcept(true)`, even if we `throw` from it. And one has to specify explicitly `noexcept(false)` if they want it to be that way for some reason. I'm seeing quite the opposite - with GCC 4.7.2, the user-defined destructor, no matter how primitive the class and destructor are, is implicitly `noexcept(false)`. What am I missing here? Is there some hidden gotcha with user-defined destructors?

Original source