Почему GCC диагностирует неиспользуемую переменную для структурированных привязок, а Clang - нет?
Давайте начнем с минимального примера:
#include <utility>
int main()
{
auto [a, b] = std::pair(1, 'A');
return a;
}
Компиляция с прохождением GCC 7.3 -std=c++17
а также -Wunused-variable
и запустить его:
<source>: In function 'int main()':
<source>:5:15: warning: unused variable 'b' [-Wunused-variable]
auto [a, b] = std::pair(1, 'A');
^
GCC может правильно сообщать об отсутствии использования b
, но он ошибочно называет это переменной. Цитата [dcl.struct.bind] / 1:
Декларация структурированной привязки представляет идентификаторы v0, v1, v2, … списка идентификаторов в виде имен ([basic.scope.declarative]) структурированных привязок.
Так b
явно не переменная, а имя. Компилируя один и тот же код с Clang 6.0.0 и с такими же флагами, мы не получаем никаких предупреждений. Удаление return a;
выписка из кода:
#include <utility>
int main()
{
auto [a, b] = std::pair(1, 'A');
// return a;
}
и снова скомпилировав его с Clang, мы получим:
<source>:5:10: warning: unused variable '[a, b]' [-Wunused-variable]
auto [a, b] = std::pair(1, 'A');
^
Который, из моей интерпретации, правильно трактует [a, b]
как переменная, и a
а также b
отдельно как только имена. Мой вопрос, почему GCC диагностирует предупреждение для b
будучи неиспользованным, учитывая, что переменная фактически используется в return a;
выписка из первого кода?
1 ответ
Это было действительно ошибка в gcc
: https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=81767 и была решена в: https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=248483