Por que o GCC está me avisando sobre uma queda, mesmo quando eu uso [[fallthrough]]?


86

No código a seguir, uso o [[fallthrough]]atributo padrão do C ++ 1z para documentar que uma falha é desejada:

#include <iostream>

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

Com o GCC 7.1, o código é compilado sem erros. No entanto, o compilador ainda me avisa sobre uma queda:

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

Por quê?


33
E aqui estava eu, pensando que vocês, pessoal do C ++, não poderiam tornar as coisas ainda mais feias!
SnakeDoc

3
@SnakeDoc: É um presente!
Deduplicator

3
@SnakeDoc Esse deveria ser um comentário sobre a resposta, o que a torna ainda pior. :)

23
Não concordo com os votos fechados. O motivo "um erro tipográfico simples" existe para os casos em que o problema do OP só ocorreu devido a algum erro não relacionado à descrição da pergunta e não será útil para mais ninguém. Neste caso é bem provável que outras pessoas se esqueçam do ponto-e-vírgula naquele local, obtenham o mesmo erro e encontrem esta questão ao procurar uma solução.
CodesInChaos

14
Não gostei muito que meu comentário tenha sido removido desta pergunta, então sou forçado a repeti-lo novamente - embora se trate de um erro tipográfico, é muito provável que outros usuários o repitam, pesquisem e encontrem essa pergunta com esta resposta. Como tal, é uma boa pergunta e uma boa resposta e merece ser deixada em aberto.
Barry

Respostas:


105

Está faltando um ponto e vírgula após o atributo:

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

O [[fallthrough]]atributo deve ser aplicado a uma instrução vazia (ver P0188R1 ). O tronco Clang atual apresenta um erro útil neste caso :

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

Atualização: Cody Gray relatou esse problema à equipe do GCC.


Mencionar a que o atributo se aplica sem o ponto-e-vírgula seria bom. Presumo que seja para o próximo caso?
CodesInChaos

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; uma vez que não é seguido por uma instrução vazia, o gcc simplesmente o ignora
musicman523

2
@ musicman523 Isso ... parece ... errado? Aparentemente, seria mais lógico exigir um ponto e vírgula, mesmo quando seguido por uma instrução vazia, e simplesmente se recusar a compilar de outra forma.
SnakeDoc

@SnakeDoc Aparentemente, é apenas um caso particular de atributos de instrução, então o analisador permite isso, mas não tem nenhuma semântica quando aplicado a uma instrução não vazia. Considere isso um bug, se desejar, e clangconserte-o.
Barmar de

2
@CodesInChaos Sem o ponto-e-vírgula, o atributo pertenceria ao rótulo.
TC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.