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

            Bug ID: 85827
           Summary: false positive for -Wunused-but-set-variable because
                    of constexpr-if
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kretz at kde dot org
  Target Milestone: ---

Testcase `-std=c++17 -Wall` (cf. https://godbolt.org/g/kfgN2V):

template <int N> int f()
{
    constexpr bool _1 = N == 1;
    constexpr bool _2 = N == 2;
    constexpr bool _3 = N == 3;

    if constexpr (_1) {
        return 5;
    } else if constexpr (_2) {
        return 1;
    } else if constexpr (_3) {
        return 7;
    }
}

int a() {
    return f<1>();
}
int b() {
    return f<2>();
}
int c() {
    return f<3>();
}

Yes, I see how one can argue that _2 and _3 are unused in f<1>. However, this
makes use of constexpr-if cumbersome. E.g. when a variable is required in all
but one branch, then it'll warn for specializations that take this one branch.
So you'll have to reorder the code such that the variable is only defined
inside the else branch where all the other branches are handled. But what if
you have two variables and their uses are disjunct? This leads to code
duplication, just for silencing the warning.

I believe, -Wunused-but-set-variable needs to consider all constexpr branches
to be useful here.

Reply via email to