web-dev-qa-db-ja.com

[[フォールスルー]]を使用してもGCCがフォールスルーについて警告するのはなぜですか?

次のコードでは、C++ 1zの標準の [[fallthrough]] 属性を使用して、フォールスルーが必要であることを文書化します。

#include <iostream>

int main() {
    switch (0) {
        case 0:
            std::cout << "a\n";
            [[fallthrough]]
        case 1:
            std::cout << "b\n";
            break;
    }
}

GCC 7.1では、コードはエラーなしでコンパイルされます。ただし、コンパイラはフォールスルーについて引き続き警告します。

warning: this statement may fall through [-Wimplicit-fallthrough=]
    std::cout << "a\n";
    ~~~~~~~~~~^~~~~~~~

どうして?

81
s3rvac

属性の後にセミコロンがありません:

case 0:
    std::cout << "a\n";
    [[fallthrough]];
    //             ^
case 1:

[[fallthrough]]属性は、空のステートメントに適用されます( P0188R1 を参照)。現在のClangトランク この場合、有用なエラーが発生します

error: fallthrough attribute is only allowed on empty statements
    [[fallthrough]]
      ^
note: did you forget ';'?
    [[fallthrough]]
                   ^
                   ;

更新:Cody Gray 報告済み GCCチームへのこの問題。

104
s3rvac