C++ Структурированная привязка с предупреждениями -Wshadow?

обновление: gcc работает, а clang нет


скомпилировать с С++ 17

GCC/Clang -Wshadow предупредит, если произойдет теневая локальная переменная, но со структурированными привязками этот флаг не работает. Как выставить предупреждение в этой ситуации?

std::tuple<int, int> yy = {-1, -2};
int x = 1;
{
  //    int x = 2;   // will warn -Wshadow
  auto [x, y] = yy;  // will not warn even if compile with -weverything 
}

person user392412    schedule 23.09.2019    source источник
comment
Как выглядит ваша строка компиляции? Вы используете -std=c++17 (или более позднюю версию)? Поскольку вы можете использовать x из структурированной привязки, я ожидаю затененного предупреждения. Предоставьте минимальный, полный и проверяемый пример (MCVE).   -  person David C. Rankin    schedule 23.09.2019


Ответы (1)


Я попробовал ваш пример на godbolt с gcc 9.2 и clang 9.0.0. Вот моя минимальная программа:

#include <tuple>

std::tuple<int, int> yy = {-1, -2};
void bla(int x)
{
    if (x)
    {
        auto [x, y] = yy;
    }
}

Получает теневое предупреждение в gcc (-Wall -Wshadow -std=c++17):

<source>: In function 'void bla(int)':

<source>:8:19: warning: declaration of 'auto x' shadows a parameter [-Wshadow]

    8 |         auto [x, y] = yy;

      |                   ^

<source>:4:14: note: shadowed declaration is here

    4 | void bla(int x)

      |          ~~~~^

<source>:8:14: warning: structured binding declaration set but not used [-Wunused-but-set-variable]

    8 |         auto [x, y] = yy;

      |              ^~~~~~

Но не в clang (-Wall -Wshadow -Wshadow-all -std=c++17):

<source>:8:14: warning: unused variable '[x, y]' [-Wunused-variable]

        auto [x, y] = yy;

             ^

1 warning generated.

Это ошибка в clang, как сообщается здесь: https://bugs.llvm.org/show_bug.cgi?id=40858.

person Frodyne    schedule 23.09.2019