clang(2.9)のGCC Extension(attribute)
例えばclangはGCCの__attribute__をいくつかサポートしている。
例えば__attribute__((noreturn) )。
gcc/clang両方でコンパイル通るように書いてるわけだけど挙動が異なる部分を発見した。
例えば
typedef void func_t( void ); void g( func_t * ); void __attribute__((noreturn)) f( void );
とあったとして、
g( f );
は両コンパイラで通った。(通らないと困るよ?
しかしfが
template < typename T > void __attribute__((noreturn)) f( void );
だった場合はどうだろうか。もちろんテンプレートパラメータは渡す。
g( f< void > );
さて、上のコードはgccでは通る。しかしclangでは
$ clang++ hoge.cpp hoge.cpp:6:12: error: no matching function for call to 'g' void h() { g( f< void > ); } ^ hoge.cpp:4:6: note: candidate function not viable: no overload of 'f' matching 'func_t *' (aka 'void (*)()') for 1st argument void g( func_t * ); ^ 1 error generated.
はえーーExtensionは仕様ではないのでバグレポするものかと悩む。しかも相手はあの(誰もassignしなかったらチケットが自動的にcloseされるという噂の)clangだ。
ちなみに回避策は
typedef void __attribute__((noreturn)) func_t();
である。
しかしこの場合今度はGCCで
$ g++ hoge.cpp hoge.cpp:3:47: warning: 'noreturn' attribute ignored [-Wattributes]
まぁこちらはwarningなので-Wno-attributesするかなんかすればまぁ...うん...