[Bug c++/84076] New: [5/6/7/8 Regression] Warning about objects through POD mistakenly claims the object is a pointer

sgunderson at bigfoot dot com gcc-bugzilla@gcc.gnu.org
Sat Jan 27 13:11:00 GMT 2018


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

            Bug ID: 84076
           Summary: [5/6/7/8 Regression] Warning about objects through POD
                    mistakenly claims the object is a pointer
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sgunderson at bigfoot dot com
  Target Milestone: ---

Test program:

#include <stdio.h>
#include <string>

int main(void)
{
        std::string str;
        printf("%s\n", str);
}

GCC 4.9 and older gives:

test.cpp: In function ‘int main()’:
test.cpp:7:20: error: cannot pass objects of non-trivially-copyable type
‘std::string {aka class std::basic_string<char>}’ through ‘...’
  printf("%s\n", str);
                    ^

GCC 5.0 and newer (including 7.3.0) prints:

test.cpp: In function ‘int main()’:
test.cpp:7:20: warning: format ‘%s’ expects argument of type ‘char*’, but
argument 2 has type ‘std::__cxx11::string* {aka
std::__cxx11::basic_string<char>*}’ [-Wformat=]
  printf("%s\n", str);
                    ^

This is a confusing warning, since it claims I'm sending a std::string * when
I'm sending a std::string. In particular, in the program I was trying to fix
this by adding ->c_str(), but .c_str() was the correct choice.


More information about the Gcc-bugs mailing list