2016-05-18 17 views
1

LinuxホストとQNXターゲットのクロスコンパイラをコンパイルしようとしています。libstdC++ mutexクラスのコンパイルでQNXクロスコンパイルが失敗する

foundry27サイトから5.1バージョンを入手しました。

これで、コンパイルされた中間のxgccによって、ターゲットlibstdC++のコンパイルがストールします。

In file included from     /home/kovtyukhrd/toolchain/builds/gcc_5_1_branch/linux-x86-o-ntox86/i486-pc-nto-qnx8.0.0/libstdc++-v3/include/condition_variable:39:0, 
      from ../../../../../libstdc++-v3/src/c++11/condition_variable.cc:25: 
/home/kovtyukhrd/toolchain/builds/gcc_5_1_branch/linux-x86-o-ntox86/i486-pc-nto-qnx8.0.0/libstdc++-v3/include/mutex:126:5: error: explicitly defaulted function 'constexpr std::mutex::mutex()' cannot be declared as constexpr because the implicit declaration is not constexpr: 
mutex() noexcept = default; 
^ 
/home/kovtyukhrd/toolchain/builds/gcc_5_1_branch/linux-x86-o-ntox86/i486-pc-nto-qnx8.0.0/libstdc++-v3/include/mutex:118:9: error: use of deleted function 'constexpr std::__mutex_base::__mutex_base()' 
    class mutex : private __mutex_base 
    ^
/home/kovtyukhrd/toolchain/builds/gcc_5_1_branch/linux-x86-o-ntox86/i486-pc-nto-qnx8.0.0/libstdc++-v3/include/mutex:65:15: note: 'constexpr std::__mutex_base::__mutex_base() noexcept' is implicitly deleted because its exception-specification does not match the implicit exception-specification 'noexcept (false)' 
constexpr __mutex_base() noexcept = default; 
     ^

だから今、私は見ることができ、そのコンパイラが暗黙的に__mutex_baseコンストラクタ、その後、コンパイルを削除しようとしている:それはのlibstdC++/SRC/C++ 11/conditional_variable.cc エラーメッセージがコンパイルしようとするとエラーが起こります継承クラス(mutex)で使用しようとすると失敗します。 Here暗黙的な例外仕様(このリンクを持っていますhere)と互換性のない、明示的な例外仕様で関数の暗黙的な削除について読むことができます。

ここで、__mutex_base()の暗黙の例外指定 'noexcept(false)' "について考える必要があります。 'noexcept(false)'指定を持つ関数を呼び出す必要がある場合、暗黙的に 'noexcept(false)'に指定することができます。しかし、プリプロセッサの後、我々はこのコードを持っている:

... 
typedef struct _sync { int __count; unsigned __owner; } sync_t; 
... 
typedef struct _sync pthread_mutex_t; 
... 
typedef pthread_mutex_t __gthread_mutex_t; 
... 

    class __mutex_base 
    { 
    protected: 
    typedef __gthread_mutex_t __native_type; 


    __native_type _M_mutex = { 0x80000000, 0xffffffff }; 

    constexpr __mutex_base() noexcept = default; 
# 78 "/home/kovtyukhrd/toolchain/builds/gcc_5_1_branch/linux-x86-o-ntox86/i486-pc-nto-qnx8.0.0/libstdc++-v3/include/mutex" 3 
    __mutex_base(const __mutex_base&) = delete; 
    __mutex_base& operator=(const __mutex_base&) = delete; 
    }; 

そして今 - 質問:「なぜ__mutex_base()が暗黙の例外指定 『noexcept(偽)』を持っています?」

もう1つの質問は、このライブラリをソースコードに変更せずに正しくコンパイルする方法です。

+0

これは、QNXネイティブミューテックスがスローするデフォルトのコンストラクタを持っていることを示しています。バグをhttps://gcc.gnu.org/bugzillaに報告してください(https://gcc.gnu.org/bugsを読んだ後)ので、 '__mutex_base'定義を修正することができます。 –

+0

@JonathanWakely gccによって生成されるデフォルトのコンストラクタを意味しますか?また、暗黙の例外仕様 'noexcept(false)'を持たないときに__mutex_base定義を修正する理由は何ですか? – Grandma

+0

いいえ、私は '__gthread_mutex_t'型のコンストラクタを意味します。これはネイティブQNXミューテックス型のtypedefです。 '__mutex_base'は1つのメンバしか持っていません。コンストラクタがスローできる場合は、そのメンバーがスローできる必要があります。私はそれに対処するために '__mutex_base'定義を修正したいと思います。 –

答えて

1

これは、GCC 5.1での問題です。これは既にGCC 5.2で修正されています。問題はint構造体のメンバのintメンバの有効な初期化子ではないため、intの範囲外であり、unsigned型の値なので、0x80000000は無効な初期化子です。それをintに変換するには、定数式では許されない変換が必要です。これはコンストラクタを非constexprにします(noexcept(false)の言及は赤いニシンのようです)。

+0

ありがとうございました。 このバグの番号を教えてもらえますか? – Grandma

+0

バグレポートが見つかりませんでした。 –

関連する問題