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

            Bug ID: 94554
           Summary: spurious -Waddress warning within "if constexpr"
                    function-null compares
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: myriachan at gmail dot com
  Target Milestone: ---

The following with -std=c++17 -Waddress:

int meow() { return 1; }
void kitty(int);
template <int (*F)()>
void test() {
    if constexpr (F) {
        kitty(F());
    } else {
        kitty(2);
    }
}
template void test<nullptr>();
template void test<meow>();

gives a spurious/pointless warning:

<source>: In instantiation of 'void test() [with int (* F)() = meow]':
<source>:12:26:   required from here
<source>:5:5: warning: the address of 'int meow()' will never be NULL
[-Waddress]
    5 |     if constexpr (F) {
      |     ^~

The warning should be suppressed in "if constexpr" contexts, because of course
it's going to be always true or always false.

Clang errors on this case, so it's possible that my code is invalid: Is it
legal to compare a function pointer against null in a constant-expression?

Reply via email to