3

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 を使用していると思われるので、これを見たのは私だけではありませんか?!

これを回答として投稿する必要があるのか​​ 、それとももっと知識のある人が来て本当の解決策を提供してくれるのかわからない.

4

1 に答える 1

0

少し待った後、これに対する既知の修正がないように見えるので、上記のように私の答えを投稿します。Xcode4.3で修正される可能性があります

そのため、コンパイラフラグ-fprofile-arcs -fprofile-coverageとともに、libprofile_rt.dylibともリンクしていました。コンパイラフラグ-fprofile-arcsを削除すると、問題が削除されました。それは私の報道レポートを壊すので、Annyoing。

(librpofile_rt.aとのリンクにも同じ問題がありました)

LLVMはおそらくテストケースにgoogletestを使用しているので、これを見るのは私だけではありませんか?!

于 2012-04-05T10:19:28.887 に答える