clang: сложить выражение и предупреждение «результат выражения не используется» - PullRequest
0 голосов
/ 07 октября 2018

На Clang 7.0 этот код:

template <typename ... Ts> struct S {
  unsigned gs(unsigned i) {
    unsigned r = 0;
    ((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
    return r;
  }
};

int foo(unsigned i) {
  S<int, double, long, float, char> s;
  return s.gs(3);
}

вызывает это предупреждение:

~/dev/ta $ ~/bin/clang++ -c -std=c++17 fold-warning.cpp 
fold-warning.cpp:5:46: warning: expression result unused [-Wunused-value]
    ((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    ^

Почему?Какое выражение не используется по логике компилятора?

Gcc 7.3 / 8.2 им доволен.

1 Ответ

0 голосов
/ 07 октября 2018

Результат этой строки:

((r = unsigned(sizeof(Ts)), i-- == 0) || ...);

- это последовательная операция ||, результат которой не используется, что вызвало предупреждение.

Приведение к void для устраненияпредупреждение:

(void)((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
...