Warum warnt mich GCC vor einem Fallthrough, selbst wenn ich [[Fallthrough]] verwende?

85

Im folgenden Code verwende ich das Standardattribut [[fallthrough]]von C ++ 1z, um zu dokumentieren, dass ein Fallthrough gewünscht wird:

#include <iostream>

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

Mit GCC 7.1 wird der Code fehlerfrei kompiliert. Der Compiler warnt mich jedoch immer noch vor einem Durchfall:

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

Warum?

s3rvac
quelle
33
Und hier war ich und dachte, Sie C ++ Leute könnten die Dinge unmöglich hässlicher machen!
SnakeDoc
3
@ SnakeDoc: Es ist ein Geschenk!
Deduplikator
3
@SnakeDoc Das sollte ein Kommentar zur Antwort sein, was es noch schlimmer macht. :)
22
Ich bin mit den engen Abstimmungen nicht einverstanden. Der Grund "ein einfacher Tippfehler" liegt in Fällen vor, in denen das Problem des OP nur aufgrund eines Fehlers aufgetreten ist, der nicht mit der Beschreibung der Frage zusammenhängt und für andere Personen nicht nützlich ist. In diesem Fall ist es sehr wahrscheinlich, dass andere Personen das Semikolon an dieser Stelle vergessen, denselben Fehler erhalten und diese Frage finden, wenn sie nach einer Lösung suchen.
CodesInChaos
13
Ich mag es nicht, dass mein Kommentar aus dieser Frage entfernt wurde, daher bin ich gezwungen, ihn erneut zu wiederholen. Dies ist zwar ein Tippfehler, aber es ist sehr wahrscheinlich, dass andere Benutzer ihn wiederholen, danach suchen und diese Frage mit dieser Antwort finden. Als solches ist es sowohl eine gute Frage als auch eine gute Antwort und verdient es, offen gelassen zu werden.
Barry

Antworten:

105

Nach dem Attribut fehlt ein Semikolon:

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

Das [[fallthrough]]Attribut soll auf eine leere Anweisung angewendet werden (siehe P0188R1 ). Der aktuelle Clang-Trunk gibt in diesem Fall einen hilfreichen Fehler :

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

Update: Cody Gray hat dieses Problem dem GCC-Team gemeldet .

s3rvac
quelle
Es wäre schön zu erwähnen, wofür das Attribut ohne das Semikolon gilt. Ich nehme an, es geht um den nächsten Fall?
CodesInChaos
2
@CodesInChaos fallthrough attribute is only allowed on empty statements; Da darauf keine leere Anweisung folgt, ignoriert gcc sie einfach
musicman523
2
@ musicman523 Das ... scheint ... falsch? Es wäre anscheinend vernünftiger, ein Semikolon zu benötigen, selbst wenn eine leere Anweisung folgt, und sich einfach zu weigern, etwas anderes zu kompilieren.
SnakeDoc
@SnakeDoc Anscheinend handelt es sich nur um einen bestimmten Fall von Anweisungsattributen, sodass der Parser dies zulässt, aber keine Semantik aufweist, wenn er auf eine nicht leere Anweisung angewendet wird. Betrachten Sie es als Fehler, wenn Sie es wünschen, und clangbeheben Sie es.
Barmar
2
@CodesInChaos Ohne das Semikolon würde das Attribut zur Bezeichnung gehören.
TC