Должна ли быть диагностика из компилятора GCC для этого плохо сформированного кода C ++ с атрибутом [[fallthrough]]?

Я тестировал функции 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]]; // ill­formed, 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;

компилятор предупреждает (живой пример):

предупреждение: атрибут «падение» не предшествует метке регистра или метке по умолчанию

Итак, два вопроса здесь:

  1. Компилятор пропустил при выдаче диагностики, или я
    здесь чего-то не хватает?
  2. Если это проблема компилятора, достаточно ли она серьезна, чтобы о ней сообщать?

12

Решение

  1. Если это проблема компилятора, достаточно ли она серьезна, чтобы о ней сообщать?

Да, ошибки соответствия являются важными ошибками, разработчики полагаются на компиляторы, соответствующие стандарту (у компилятора могут быть режимы, которые не требуют строгого соответствия, хотя gcc требует -педантичный, чтобы получить всю диагностику, требуемую стандартом) Приоритет, который получает ошибка, — это другая история, но простое документирование ошибки и наличие команды компилятора, признающей ее как ошибку, может стать огромной помощью для будущих разработчиков, которые столкнутся с ошибкой.

  1. Компилятор пропустил выдачу диагностики, или я что-то здесь упускаю?

Да, это плохо сформировано согласно [Dcl.attr.fallthrough #] p1:

… Следующим оператором, который будет выполнен после оператора с ошибками, должен быть оператор с меткой, метка которого является меткой регистра или меткой по умолчанию для того же оператора переключения. Программа некорректна, если такого заявления нет.

и компилятор должен выдать хотя бы диагностическую [Intro.compliance] P2.2:

Если программа содержит нарушение какого-либо диагностируемого правила или возникновение конструкции, описанной в
этот документ как «условно поддерживаемый», когда реализация не поддерживает эту конструкцию,
соответствующая реализация должна выдать хотя бы одно диагностическое сообщение.

9

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

Через некоторое время после того, как я разместил этот вопрос, ошибка было сообщено на основе вопроса.
Я ждал, чтобы увидеть, будет ли это принято. это было принято и назначено, и на основании этого комментарий в отчете об ошибке, патч будет сгенерирован. Так что это эффективно отвечает на оба моих вопроса.

Тем не менее, я приму ответ, данный @ShafikYaghmour, потому что он содержит важные моменты, касающиеся моих вопросов.

3

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