Я тестировал функции C++ 17 в компиляторе GCC версии 7.1.0. Это связано с атрибутом fallthrough
и следующий пример (живой пример) адаптирован из онлайн-ссылки CPP здесь
#include "iostream"
using namespace std;
int f(int n) {
switch (n) {
case 1:
case 2:
n = n + 20;
[[fallthrough]];
case 3: // no warning on fallthrough
n = n + 30;
case 4: // compiler may warn on fallthrough
[[fallthrough]]; // illformed, not before a case label
//n = n + 40; //commented out to test if compiler will warn.
}
return n;
}
int main()
{
cout << f(1) << endl;
cout << f(2) << endl;
cout << f(3) << endl;
cout << f(4) << endl;
return 0;
}
Последний [[fallthrough]]
(для case 4:
[[fallthrough]]
плохо сформирован.
Вопрос о том, "Что компилятор C++ должен делать с плохо сформированными программами в соответствии со стандартом?" здесь есть главный ответ, в котором говорится, что:
Итак, подведем итог: если некорректная программа содержит диагностируемое нарушение, для которого в Стандарте явно не указано "нет необходимости диагностики", соответствующие реализации должны испускать диагностику.
Итак, я просмотрел стандарт (N4713), чтобы убедиться, что он не указал, что для этой проблемы не было никакой диагностики. Я не смог найти такого заявления.
Интересно, что после всего этого, когда я добавил следующий оператор после последнего [[fallthrough]]
n = n + 40;
компилятор предупреждает (живой пример):
warning: атрибут 'fallthrough', не предшествующий ярлыку case или метке по умолчанию
Итак, два вопроса:
- Прокомментировал ли компилятор диагностику, или я что-то упустил?
- Если это проблема с компилятором, достаточно ли этого достаточно для сообщения?