bolero-MURAKAMI / Sprout

C++11/14 constexpr based Containers, Algorithms, Random numbers, Parsing, Ray tracing, Synthesizer, and others.

Home Page:http://bolero-murakami.github.io/Sprout/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

sprout::enabler の定義が無い

kariya-mitsuru opened this issue · comments

sprout::enabler_if を使用する場合は以下のような感じになるので、sprout::enabler は ODR-used になると思うのですが、sprout::enabler は GCC や clang では定義されません。

#include <sprout/type_traits/enabler_if.hpp>

template<sprout::enabler_if_t<true> = sprout::enabler>
void f() {}

int main()
{
    f();
}

ODR-used のオブジェクトが定義されていないと ill-formed になるので(ただし、no diagnostic required)、GCC や clang であっても定義すべきと思うのですが、いかがでしょうか。
ちなみに、現状 GCC では意図したとおりに動作するようですが、clang では -g オプションをつけるとリンクエラーになります。
http://melpon.org/wandbox/permlink/5ZIS1xVQL1pM4zQW

こうした使用では enabler が discarded-value expression(結果が捨てられる)に該当するので odr-use には当たらないと思うのですがどうでしょう。
ただ、 -g オプションでエラーになるというのは気になりますね。

私なりに規格書を読んだのですが、discarded-value expression に該当する箇所は、

  1. void に明示的にキャストされた式
  2. カンマ演算子の左側の部分式
  3. 式文の式

の 3 つしか見つけられませんでした。
上記の enabler はこの 3 つのいずれにも該当しないので、odr-used に該当するのではないかなぁ、と。
ちょっと SO にでも聞いてみます。

やはり SO でも odr-used になると言う意見でした。
なお、-g 付きでも -O も一緒に指定するとリンクエラーにはなりませんでした。
http://melpon.org/wandbox/permlink/Bo8kJPVgWiQKr1R7
ちなみに、llvm にはバグレポは出してるんですが、UB だからほっとくって決めた記憶がある、とのコメントが付いてます。(まだ閉じられてはいないのですが)

fixed: commit 59fa680