¿Por qué GCC me advierte sobre una falla incluso cuando uso [[fallthrough]]?


86

En el siguiente fragmento de código, utilizo el [[fallthrough]]atributo estándar de C ++ 1z para documentar que se desea una falla:

#include <iostream>

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

Con GCC 7.1, el código se compila sin errores. Sin embargo, el compilador todavía me advierte sobre una falla:

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

¿Por qué?


33
¡Y aquí estaba yo, pensando que ustedes, los de C ++, no podrían hacer las cosas más feas!
SnakeDoc

3
@SnakeDoc: ¡Es un regalo!
Deduplicador

3
@SnakeDoc Eso debería ser un comentario sobre la respuesta, lo que lo empeora aún más. :)

23
No estoy de acuerdo con las votaciones cercanas. La razón de "un simple error tipográfico" existe para los casos en los que el problema del OP solo ocurrió debido a algún error no relacionado con la descripción de la pregunta y no será útil para nadie más. En este caso es bastante probable que otras personas olviden el punto y coma en ese lugar, obtengan el mismo error y encuentren esta pregunta al buscar una solución.
CodesInChaos

14
Me disgusta mucho que mi comentario haya sido eliminado de esta pregunta, por lo que me veo obligado a repetirlo nuevamente; si bien esto es un error tipográfico, es muy probable que otros usuarios lo repitan, lo busquen y encuentren esta pregunta con esta respuesta. Como tal, es una buena pregunta y una buena respuesta y merece que se deje abierta.
Barry

Respuestas:


105

Falta un punto y coma después del atributo:

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

El [[fallthrough]]atributo se aplicará a una declaración vacía (consulte P0188R1 ). El tronco de Clang actual da un error útil en este caso :

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

Actualización: Cody Gray informó este problema al equipo de GCC.


Sería bueno mencionar a qué se aplica el atributo sin el punto y coma. ¿Asumo que es para el próximo caso?
CodesInChaos

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; ya que no va seguida de una declaración vacía, gcc simplemente la ignora
musicman523

2
@ musicman523 Eso ... parece ... ¿mal? Aparentemente, sería más sensato requerir un punto y coma incluso cuando esté seguido de una declaración vacía, y simplemente negarse a compilar de otra manera.
SnakeDoc

@SnakeDoc Aparentemente es solo un caso particular de atributos de declaración, por lo que el analizador lo permite, pero no tiene semántica cuando se aplica a una declaración no vacía. Considérelo un error si lo desea y lo clangsolucionó.
Barmar

2
@CodesInChaos Sin el punto y coma, el atributo pertenecería a la etiqueta.
TC
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.