[LLVMbugs] [Bug 11893] New: When noexcept is violated clang should call __cxa_begin_catch(unwind_arg) prior to calling std::terminate
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Mon Jan 30 18:00:11 PST 2012
http://llvm.org/bugs/show_bug.cgi?id=11893
Bug #: 11893
Summary: When noexcept is violated clang should call
__cxa_begin_catch(unwind_arg) prior to calling
std::terminate
Product: clang
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P
Component: C++0x
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: hhinnant at apple.com
CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
Classification: Unclassified
This test:
#include <iostream>
#include <stdexcept>
#include <exception>
#include <cstdlib>
void handler1()
{
std::cout << "handler 1\n";
std::abort();
}
void handler2()
{
std::cout << "handler 2\n";
std::abort();
}
struct A
{
~A() {std::set_terminate(handler2);}
};
void f2()
{
std::set_terminate(handler1);
throw std::runtime_error("throw in f2");
}
void f1() noexcept
{
A a;
f2();
}
int main()
{
f1();
}
Should output:
handler 1
When run against the trunk libc++abi. Note that the trunk libc++abi won't run
with the trunk libc++, but this will change soon (within a few days).
When the noexcept is violated, clang currently outputs a call to
std::terminate(). Just prior to that call clang needs to call
__cxa_begin_catch(unwind_arg) to make this work.
Reference [except.handle]/p7:
Also, an implicit handler is considered active when std::terminate() or
std::unexpected() is entered due to a throw.
With the Itanium ABI, the way you make a handler active is by calling
__cxa_begin_catch(unwind_arg).
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list