https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82800

            Bug ID: 82800
           Summary: Incorrect warning on "may be used uninitialized in
                    this function" in variadic template code
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alonzakai at gmail dot com
  Target Milestone: ---

The testcase below fails with

g++- a.cpp -std=c++11 -Wall -Werror -O2

It fails on 7.2.0, but works on 5.4.0, so this looks like a regression.

Testcase:
===
#include <cmath>
#include <cstdint>
#include <cstdlib>

struct Maker {
  double makeConst() {
    return pick<double>(0, 0, 0, 0, 0, 0, 1);
  }

  template<typename T, typename... Args>
  T pick(T first, Args... args) {
    return pickGivenNum<T>(rand(), first, args...);
  }

  template<typename T>
  T pickGivenNum(size_t num, T first) {
    if (num != 0) abort();
    return first;
  }

  template<typename T, typename... Args>
  T pickGivenNum(size_t num, T first, Args... args) {
    if (num == 0) return first;
    return pickGivenNum<T>(num - 1, args...);
  }
};

int main() {
  Maker maker;
  maker.makeConst();
  maker.makeConst();
}
===

The error is
===
a.cpp: In function ‘double Maker::makeConst()’:
a.cpp:8:44: error: ‘first’ may be used uninitialized in this function
[-Werror=maybe-uninitialized]
     return pick<double>(0, 0, 0, 0, 0, 0, 1);                                 
      ^
===
This may have something to do with it being a variadic template (I couldn't
reduce it any more without that template).

Reply via email to