Я тестировал функции 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:
) плохо сформирован.
Вопрос «Что компилятору C ++ требуется делать с плохо сформированными программами в соответствии со Стандартом?» Вот имеет вершину ответ основываясь на этом:
Итак, подведем итог: если неправильно сформированная программа содержит диагностируемое нарушение, для которого Стандарт не содержит явного указания «не требуется диагностика», соответствующие реализации должны выдавать диагностическую информацию..
Итак, я посмотрел стандарт (N4713), чтобы убедиться, что в нем не указано, что для этой проблемы не требуется никакой диагностики. Я не смог найти ни одного такого заявления.
Интересно, после всего этого, когда я добавил следующее утверждение после последнего [[fallthrough]]
n = n + 40;
компилятор предупреждает (живой пример):
предупреждение: атрибут «падение» не предшествует метке регистра или метке по умолчанию
Итак, два вопроса здесь:
- Если это проблема компилятора, достаточно ли она серьезна, чтобы о ней сообщать?
Да, ошибки соответствия являются важными ошибками, разработчики полагаются на компиляторы, соответствующие стандарту (у компилятора могут быть режимы, которые не требуют строгого соответствия, хотя gcc требует -педантичный, чтобы получить всю диагностику, требуемую стандартом) Приоритет, который получает ошибка, — это другая история, но простое документирование ошибки и наличие команды компилятора, признающей ее как ошибку, может стать огромной помощью для будущих разработчиков, которые столкнутся с ошибкой.
- Компилятор пропустил выдачу диагностики, или я что-то здесь упускаю?
Да, это плохо сформировано согласно [Dcl.attr.fallthrough #] p1:
… Следующим оператором, который будет выполнен после оператора с ошибками, должен быть оператор с меткой, метка которого является меткой регистра или меткой по умолчанию для того же оператора переключения. Программа некорректна, если такого заявления нет.
и компилятор должен выдать хотя бы диагностическую [Intro.compliance] P2.2:
Если программа содержит нарушение какого-либо диагностируемого правила или возникновение конструкции, описанной в
этот документ как «условно поддерживаемый», когда реализация не поддерживает эту конструкцию,
соответствующая реализация должна выдать хотя бы одно диагностическое сообщение.
Через некоторое время после того, как я разместил этот вопрос, ошибка было сообщено на основе вопроса.
Я ждал, чтобы увидеть, будет ли это принято. это было принято и назначено, и на основании этого комментарий в отчете об ошибке, патч будет сгенерирован. Так что это эффективно отвечает на оба моих вопроса.
Тем не менее, я приму ответ, данный @ShafikYaghmour, потому что он содержит важные моменты, касающиеся моих вопросов.