Pourquoi GCC m'avertit-il d'une erreur même lorsque j'utilise [[fallthrough]]?

86

Dans le morceau de code suivant, j'utilise l' [[fallthrough]]attribut standard de C ++ 1z pour documenter qu'une chute est souhaitée:

#include <iostream>

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

Avec GCC 7.1, le code se compile sans erreur. Cependant, le compilateur me prévient toujours d'une erreur:

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

Pourquoi?

s3rvac
la source
33
Et j'étais là, pensant que vous, les gens du C ++, ne pourriez pas rendre les choses plus laides!
SnakeDoc du
3
@SnakeDoc: C'est un cadeau!
Deduplicator
3
@SnakeDoc Cela devrait être un commentaire sur la réponse, ce qui aggrave encore la situation. :)
23
Je ne suis pas d'accord avec les votes serrés. La raison «une simple erreur typographique» existe pour les cas où le problème du PO n'est survenu qu'à cause d'une erreur sans rapport avec la description de la question et ne sera utile à personne d'autre. Dans ce cas, il est fort probable que d'autres personnes oublient le point-virgule à cet endroit, obtiennent la même erreur et trouvent cette question lors de la recherche d'une solution.
CodesInChaos du
14
Je n'aime pas du tout que mon commentaire ait été supprimé de cette question, je suis donc obligé de le répéter - bien qu'il s'agisse en effet d'une erreur typographique, il est très probable que d'autres utilisateurs le répètent, le recherchent et trouvent cette question avec cette réponse. En tant que telle, c'est à la fois une bonne question et une bonne réponse et mérite d'être laissée ouverte.
Barry

Réponses:

105

Il vous manque un point-virgule après l'attribut:

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

L' [[fallthrough]]attribut doit être appliqué à une instruction vide (voir P0188R1 ). Le coffre Clang actuel donne une erreur utile dans ce cas :

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

Mise à jour: Cody Gray a signalé ce problème à l'équipe du CCG.

s3rvac
la source
Mentionner à quoi s'applique l'attribut sans le point-virgule serait bien. Je suppose que c'est au cas suivant?
CodesInChaos du
2
@CodesInChaos fallthrough attribute is only allowed on empty statements; comme il n'est pas suivi d'une instruction vide, gcc l'ignore simplement
musicman523
2
@ musicman523 Cela ... semble ... faux? Il serait apparemment plus raisonnable d'exiger un point-virgule même lorsqu'il est suivi d'une instruction vide, et de refuser simplement de compiler autrement.
SnakeDoc du
@SnakeDoc Apparemment, c'est juste un cas particulier d'attributs d'instruction, donc l'analyseur le permet, mais il n'a aucune sémantique lorsqu'il est appliqué à une instruction non vide. Considérez cela comme un bogue si vous le souhaitez et clangcorrigez-le.
Barmar du
2
@CodesInChaos Sans le point-virgule, l'attribut appartiendrait à l'étiquette.
TC