Commit f3e10f8b authored by Tom Stellard's avatar Tom Stellard
Browse files

Merging r333467:

------------------------------------------------------------------------
r333467 | marshall | 2018-05-29 15:25:42 -0700 (Tue, 29 May 2018) | 1 line

Fix embarrasing typo in uncaught_exceptions. Update tests to really test this. Thanks to Peter Klotz for calling my attention to this.
------------------------------------------------------------------------

llvm-svn: 333910
parent 742e3215
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ bool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; }

int uncaught_exceptions() _NOEXCEPT
{
# if _LIBCPPABI_VERSION > 1101
# if _LIBCPPABI_VERSION > 1001
    return __cxa_uncaught_exceptions();
# else
    return __cxa_uncaught_exception() ? 1 : 0;
+29 −21
Original line number Diff line number Diff line
@@ -15,40 +15,48 @@
// XFAIL: availability=macosx10.9
// XFAIL: availability=macosx10.10
// XFAIL: availability=macosx10.11
// XFAIL: with_system_cxx_lib=macosx10.12
// XFAIL: with_system_cxx_lib=macosx10.13

// test uncaught_exceptions

#include <exception>
#include <cassert>

struct A
{
    ~A()
    {
        assert(std::uncaught_exceptions() > 0);
    }
struct Uncaught {
    Uncaught(int depth) : d_(depth) {}
    ~Uncaught() { assert(std::uncaught_exceptions() == d_); }
    int d_;
    };

struct B
{
    B()
    {
        // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#475
        assert(std::uncaught_exceptions() == 0);
struct Outer {
    Outer(int depth) : d_(depth) {}
    ~Outer() {
    try {
        assert(std::uncaught_exceptions() == d_);
        Uncaught u(d_+1);
        throw 2;
    }
    catch (int) {}
    }
    int d_;
};

int main()
int main () {
    assert(std::uncaught_exceptions() == 0);
    {
    try
    Outer o(0);
    }
    
    assert(std::uncaught_exceptions() == 0);
    {
        A a;
    try {
        Outer o(1);
        throw 1;
        }
    catch (int) {
        assert(std::uncaught_exceptions() == 0);
        throw B();
        }   
    catch (...)
    {
        assert(std::uncaught_exception() == 0);
    }
    assert(std::uncaught_exceptions() == 0);
}