C++ プロジェクトで googletest を実行しようとしていますが、その一部としてEXPECT_THROW(statement, expected_exception);
. 「Apple LLVM Compiler 3.0」を選択してXCodeを使用しています。これはすべて、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;
}
次に、 gdb にブレークポイントを設定してステップスルーすると、がスキップされ、が実行されているcatch catch
ことがわかります。ブロックをコメントアウトすると、正しいステートメントが実行されます。catch(runtime_errors)
catch(...)
catch(...)
catch(std::runtime_error const& e)
コンパイラを「LLVM GCC 4.2」に設定すると問題は解決しますが、clang++ をターゲットにしたいと考えています。
コマンドラインでclang ++を使用して手動でコンパイルすると、別のEXPECT_THROWテストケースが機能するため、難解なxcodeまたはllvm設定である必要があると思いますか? それとも、LLVM が私の runtime_error を他の型にどのようにねじ曲げているのでしょうか? を試しましたcatch throw
が、そのコンテキストで任意の型情報を取得できました。
誰もがこれを以前に経験したか、何か考えがありますか?
編集:
そのため、libprofile_rt.dylib とコンパイラ フラグもリンクしていました-fprofile-arcs -fprofile-coverage
。コンパイラ フラグを-fprofile-arcs
削除すると、問題が解決されました。それは私の報道レポートを壊すので迷惑です。
(librpofile_rt.a とのリンクにも同じ問題がありました)
LLVM はテストケースに googletest を使用していると思われるので、これを見たのは私だけではありませんか?!
これを回答として投稿する必要があるのか 、それとももっと知識のある人が来て本当の解決策を提供してくれるのかわからない.