C ++ Структурированное связывание с -Wshadow предупреждениями? - PullRequest
0 голосов
/ 23 сентября 2019

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


компилируется с C ++ 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 
}

1 Ответ

1 голос
/ 23 сентября 2019

Я попробовал ваш пример на Годболт с 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.

Полагаю, это проблема лягушки.

...