捕获(...)吞噬xcode llvm 3.0中的所有其他捕获

时间:2012-03-29 05:21:33

标签: c++ xcode unit-testing llvm clang++

我正在尝试让googletest在我的c ++项目上运行,其中一部分涉及使用EXPECT_THROW(statement, expected_exception);。我正在使用XCode选择“Apple LLVM Compiler 3.0”。所有这些都在Snow Leopard 10.6.8,XCode 4.2上。

即使使用显式虚拟案例EXPECT_THROW(throw std::runtime_error(), std::runtime_error);

,也无法通过任何这些测试

将宏(从gtest / internal / gtest-internal.h:1114 GTEST_TEST_THROW_)扩展到

之后
    bool gtest_caught_expected = false;
    try {
        // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);
        throw std::runtime_error("sigh");
    }
    // catch (expected_exception const&) {
    catch (std::runtime_error const& e){
        std::cout << "const ref caught" << std::endl;
        gtest_caught_expected = true;
    }
    // added by me to check it wasn't a const& issue
    catch (std::runtime_error e){
        std::cout << "type caught" << std::endl;
        gtest_caught_expected = true;
    }
    catch (...) {
        //gtest_msg.value =
        // "Expected: " #statement " throws an exception of type "
        //#expected_exception ".\n  Actual: it throws a different type.";
        //goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);
        std::cout << "unknown caught" << std::endl;         
    }

然后使用catch catch在gdb中设置一个断点并单步执行,我可以看到catch(runtime_errors)被跳过,catch(...)正在执行。如果我注释掉catch(...)块,则执行正确的catch(std::runtime_error const& e)语句。

将我的编译器设置为“LLVM GCC 4.2”解决了这个问题,但我想针对clang ++。

我在单独的EXPECT_THROW测试用例在命令行上使用clang ++手动编译时工作,所以我认为它必须是一些深奥的xcode或llvm设置?或者也许是LLVM如何将我的runtime_error变为其他类型?我尝试了catch throw,但可以在该上下文中获取任何类型信息。

之前有没有经历过这个或有任何想法?

修改

所以我还与libprofile_rt.dylib以及编译器标志-fprofile-arcs -fprofile-coverage链接。删除编译器标志-fprofile-arcs删除了该问题。 Annyoing,因为它打破了我的报道报道。

(与librpofile_rt.a链接有同样的问题)

当然,我不是唯一一个看到这个,因为LLVM据说使用googletest作为他们的测试用途?!

不确定我是否应该将此作为答案发布,或者是否有更多知识渊博的人可以提供并提供真正的解决方案。

1 个答案:

答案 0 :(得分:0)

等了一会儿,看起来没有一个已知的修复方法,所以我会按照上面的说法发布我的答案。它可能在Xcode 4.3中修复

所以我还与libprofile_rt.dylib连接,以及编译器标志-fprofile-arcs -fprofile-coverage。删除编译器标志-fprofile-arcs删除了该问题。 Annyoing,因为它打破了我的报道报道。

(与librpofile_rt.a链接有同样的问题)

当然,我不是唯一一个看到这个,因为LLVM据说使用googletest作为他们的测试用途?!