/* PR c++/57111 - Generalize -Wfree-nonheap-object to delete Verify that even without -Wsystem-headers the warning is issued for pairs of library functions defined in system headers. { dg-do compile { target c++11 } } { dg-options "-O2 -Wall" } { dg-skip-if "requires hosted libstdc++ for string" { ! hostedlib } } */ #include #include void test_string () { std::string str ("abc"); // { dg-message "declared here" } const char *s = str.c_str (); __builtin_printf ("%s\n", s); /* Because the delete call is made directly in the function this does not exercise the same thing as test_unique_ptr. */ delete s; // { dg-warning "'void operator delete\\(void\\*\[^\\)\]*\\)' called on unallocated object 'str'" } } void test_unique_ptr () { int arr[]= { 1, 2 }; // { dg-message "declared here" } std::unique_ptr up (arr); __builtin_printf ("%i %i\n", up[0], up[1]); /* TO DO: verify that the warning is printed, including its inlining context (the directive below doesn't work): { Xdg-message "In member function.*inlined from 'void test_unique_ptr\\(\\)'.*warning: 'void operator delete \\\[]\\(void\\*\\)' called on unallocated object 'arr'" "" { target *-*-* } 0 } */ /* Here, the delete call is made indirectly from std::unique_ptr dtor. */ } /* Prune out the warning from test_unique_ptr(). { dg-prune-output "-Wfree-nonheap-object" } */