[LLVMbugs] [Bug 7132] New: [C++ CodeGen] Cannot catch std::bad_cast

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu May 13 14:44:34 PDT 2010


http://llvm.org/bugs/show_bug.cgi?id=7132

           Summary: [C++ CodeGen] Cannot catch std::bad_cast
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: dgregor at apple.com
                CC: llvmbugs at cs.uiuc.edu, dgregor at apple.com
            Blocks: 6023


We aren't able to catch a std::bad_cast in a catch block, as in the following
test:

terfin:clang dgregor$ cat t.cpp 
#include <typeinfo>

extern "C" void abort();
extern "C" int printf(const char*, ...);

struct A { virtual ~A() { } };
struct B : A { virtual ~B() { } };

int main() {
  A *a = new A();
  try {
    (void)dynamic_cast<B&>(*a);
    printf("Survived dynamic_cast?\n");
    abort();
  } catch (const std::bad_cast &) {
    // Okay
    return 0;
  }

  printf("Did not catch std::bad_cast?\n");
  abort();
  return 0;
}
terfin:clang dgregor$ clang++ t.cpp && ./a.out
Survived dynamic_cast?
Abort trap
terfin:clang dgregor$ g++ t.cpp && ./a.out

The problem is in the "catch" handling; if g++ compiles the try/catch and
either clang or g++ compile the dynamic_cast, the program works as expected. If
clang compiles the try/catch, it fails.

This affects Boost.StateChart.

-- 
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