Почему 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

Другие вопросы по тегам