web-dev-qa-db-fra.com

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

Dans le code suivant, j’utilise la norme [[fallthrough]] attribuez à C++ 1z de documenter le fait qu’une réduction 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 est compilé sans erreur. Cependant, le compilateur me met toujours en garde contre un échec:

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

Pourquoi?

81
s3rvac

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

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

Le [[fallthrough]] attribut doit être appliqué à une instruction vide (voir P0188R1 ). Le tronc 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 rapporté ce problème à l’équipe de GCC.

104
s3rvac