Implement uncaught_exceptions() to get a count, rather than a bool. Update the libc++abi version. Reviewed as http://reviews.llvm.org/D10067

llvm-svn: 238827
This commit is contained in:
Marshall Clow 2015-06-02 13:03:17 +00:00
parent 8e9c266a77
commit 604de5c256
3 changed files with 46 additions and 6 deletions

View File

@ -20,7 +20,7 @@
#include <__cxxabi_config.h>
#define _LIBCPPABI_VERSION 1001
#define _LIBCPPABI_VERSION 1002
#define LIBCXXABI_NORETURN __attribute__((noreturn))
#ifdef __cplusplus
@ -161,8 +161,9 @@ extern void __cxa_rethrow_primary_exception(void* primary_exception);
extern void __cxa_increment_exception_refcount(void* primary_exception) throw();
extern void __cxa_decrement_exception_refcount(void* primary_exception) throw();
// Apple addition to support std::uncaught_exception()
extern bool __cxa_uncaught_exception() throw();
// Apple extension to support std::uncaught_exception()
extern bool __cxa_uncaught_exception () throw();
extern unsigned int __cxa_uncaught_exceptions() throw();
#ifdef __linux__
// Linux TLS support. Not yet an official part of the Itanium ABI.

View File

@ -710,13 +710,16 @@ __cxa_rethrow_primary_exception(void* thrown_object)
}
bool
__cxa_uncaught_exception() throw()
__cxa_uncaught_exception() throw() { return __cxa_uncaught_exceptions() != 0; }
unsigned int
__cxa_uncaught_exceptions() throw()
{
// This does not report foreign exceptions in flight
__cxa_eh_globals* globals = __cxa_get_globals_fast();
if (globals == 0)
return false;
return globals->uncaughtExceptions != 0;
return 0;
return globals->uncaughtExceptions;
}
} // extern "C"

View File

@ -0,0 +1,36 @@
//===------------------- uncaught_exceptions.pass.cpp ---------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <cxxabi.h>
#include <exception>
#include <cassert>
// namespace __cxxabiv1 {
// extern bool __cxa_uncaught_exception () throw();
// extern unsigned int __cxa_uncaught_exceptions() throw();
// }
struct A {
~A() { assert( __cxxabiv1::__cxa_uncaught_exception()); }
};
struct B {
B(int cnt) : data_(cnt) {}
~B() { assert( data_ == __cxxabiv1::__cxa_uncaught_exceptions()); }
int data_;
};
int main ()
{
try { A a; throw 3; assert (false); }
catch (int) {}
try { B b(1); throw 3; assert (false); }
catch (int) {}
}