Почему GCC предупреждает меня о провале, даже когда я использую [[fallthrough]]?

В следующем фрагменте кода я использую стандартный атрибут [[fallthrough]] из С++ 1z для документирования того, что требуется прохождение:

#include <iostream>

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

С GCC 7.1 код компилируется без ошибок. Однако компилятор все еще предупреждает меня о провале:

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

Почему?

Ответ 1

Вам не хватает точки с запятой после атрибута:

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

Атрибут [[fallthrough]] должен применяться к пустой инструкции (см. P0188R1). Текущая ствол Clang дает полезную ошибку в этом случае:

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

Обновление: Cody Gray сообщил эту проблему команде GCC.