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

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

#include <iostream>

int main() {
    switch (0) {
        case 0:
            std::cout << "an";
            [[fallthrough]]
        case 1:
            std::cout << "bn";
            break;
    }
}

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

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

почему?

1 ответов


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

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

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

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

Обновление: Коди Серый об этом сообщает эта проблема для команды GCC.