Quash a TODO related to catching pointer-to-member. These tests fail on my copy of gcc-4.2. But I believe the tests to be correct (and they pass for libc++abi). I've enquired on the C++ standards mailing list for a clarification in case I'm wrong. So far I've gotten one response that agrees with me.

llvm-svn: 149534
This commit is contained in:
Howard Hinnant 2012-02-01 20:53:21 +00:00
parent 72e6ce5aa9
commit 2d6810fbd6
3 changed files with 115 additions and 2 deletions

View File

@ -380,8 +380,7 @@ __vmi_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info,
}
}
// Handles bullets 1 and 4
// TODO: Are we good to go here for __pointer_to_member_type_info?
// Handles bullets 1 and 4 for both pointers and member pointers
bool
__pbase_type_info::can_catch(const __shim_type_info* thrown_type,
void*&) const

View File

@ -0,0 +1,57 @@
//===----------------- catch_member_data_pointer_01.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 <cassert>
struct A
{
const int i;
int j;
};
typedef const int A::*md1;
typedef int A::*md2;
void test1()
{
try
{
throw &A::i;
assert(false);
}
catch (md2)
{
assert(false);
}
catch (md1)
{
}
}
void test2()
{
try
{
throw &A::j;
assert(false);
}
catch (md1)
{
assert(false);
}
catch (md2)
{
}
}
int main()
{
test1();
test2();
}

View File

@ -0,0 +1,57 @@
//===--------------- catch_member_function_pointer_01.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 <cassert>
struct A
{
void foo() {}
void bar() const {}
};
typedef void (A::*mf1)();
typedef void (A::*mf2)() const;
void test1()
{
try
{
throw &A::foo;
assert(false);
}
catch (mf2)
{
assert(false);
}
catch (mf1)
{
}
}
void test2()
{
try
{
throw &A::bar;
assert(false);
}
catch (mf1)
{
assert(false);
}
catch (mf2)
{
}
}
int main()
{
test1();
test2();
}