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

В следующем фрагменте кода я использую стандарт [[fallthrough]] атрибут из C ++ 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";
~~~~~~~~~~^~~~~~~~

Зачем?

77

Решение

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

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]]
^
;

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

99

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]