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


86

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

#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";
    ~~~~~~~~~~^~~~~~~~

どうして?


33
そして、ここで私は、C ++の人々はおそらく物事を醜くすることはできないと思っていました!
snakeDoc 2017

3
@SnakeDoc:それは贈り物です!
deduplicator 2017

3
@SnakeDocそれは答えに対するコメントであるはずです、それはそれをさらに悪化させます。:)

23
私は賛成票に同意しません。「単純な誤植」の理由は、OPの問題が質問の説明とは関係のない何らかの間違いのためにのみ発生し、他の人には役に立たない場合に存在します。この場合、他の人がその場所のセミコロンを忘れて、同じエラーが発生し、解決策を探すときにこの質問を見つける可能性が非常に高くなります。
CodesInChaos 2017

14
私のコメントがこの質問から削除されたことを強く嫌うので、もう一度繰り返す必要があります-これは確かに誤植ですが、他のユーザーがそれを繰り返して検索し、この回答でこの質問を見つける可能性が非常に高いです。このように、それは良い質問であり、良い答えでもあり、オープンのままにしておく価値があります。
バリー

回答:


105

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

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]]
                   ^
                   ;

更新:CodyGrayこの問題をGCCチームに報告しました。


セミコロンなしで属性が何に適用されるかについて言及するとよいでしょう。次の場合だと思いますか?
CodesInChaos 2017

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; 空のステートメントが続かないため、gccは単にそれを無視します
musicman523 2017

2
@ musicman523それは...どうやら...間違っている?空のステートメントが続く場合でもセミコロンを要求し、それ以外の場合はコンパイルを拒否する方が、一見正気であるように思われます。
snakeDoc 2017

@SnakeDocどうやら、これはステートメント属性の特定のケースにすぎないため、パーサーはそれを許可しますが、空でないステートメントに適用された場合、セマンティクスはありません。必要に応じてバグと見なし、clang修正しました。
バーマー2017

2
@CodesInChaosセミコロンがないと、属性はラベルに関連付けられます。
TC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.