[Bug c++/94554] New: spurious -Waddress warning within "if constexpr" function-null compares

myriachan at gmail dot com gcc-bugzilla@gcc.gnu.org
Fri Apr 10 18:58:47 GMT 2020


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?


More information about the Gcc-bugs mailing list