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

            Bug ID: 105885
           Summary: [Regression]: Spurious warning: "the address of [...]
                    will never be NULL [-Waddress]" with const char*
                    template argument
           Product: gcc
           Version: 12.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: i...@ebner-markus.de
  Target Milestone: ---

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

#include <iostream>

template<const char* ARG = nullptr>
void test() {
    if constexpr(ARG == nullptr) {
        std::cout << "Nullptr!!" << std::endl;
    } else {
        std::cout << ARG << "heh" << std::endl;
    }
}

const char CONSTSTR[] = {'\n', '\t', ' ', '\0'};

int main() {
    test();
    test<CONSTSTR>();
}

gives a spurious/pointless warning:

<source>: In instantiation of 'void test() [with const char* ARG = (&
CONSTSTR)]':
<source>:16:19:   required from here
<source>:5:22: warning: the address of 'CONSTSTR' will never be NULL
[-Waddress]
    5 |     if constexpr(ARG == nullptr) {
      |                  ~~~~^~~~~~~~~~
<source>:12:12: note: 'CONSTSTR' declared here
   12 | const char CONSTSTR[] = {'\n', '\t', ' ', '\0'};
      |            ^~~~~~~~
ASM generation compiler returned: 0
<source>: In instantiation of 'void test() [with const char* ARG = (&
CONSTSTR)]':
<source>:16:19:   required from here
<source>:5:22: warning: the address of 'CONSTSTR' will never be NULL
[-Waddress]
    5 |     if constexpr(ARG == nullptr) {
      |                  ~~~~^~~~~~~~~~
<source>:12:12: note: 'CONSTSTR' declared here
   12 | const char CONSTSTR[] = {'\n', '\t', ' ', '\0'};



Clang doesn't produce a warning for this case.
Potentially very similar to: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94554

Reply via email to