]> git.ipfire.org Git - thirdparty/gcc.git/commit
c-family: add hints for strerror
authorOskari Pirhonen <xxc3ncoredxx@gmail.com>
Wed, 28 Feb 2024 01:13:30 +0000 (19:13 -0600)
committerJason Merrill <jason@redhat.com>
Wed, 29 May 2024 13:02:00 +0000 (09:02 -0400)
commit19c491d1848a8410559247183597096778967edf
tree700557c3d6b5e703d767c20b3b84701afc270540
parentf46eaad445e680034df51bd0dec4e6c7b1f372a4
c-family: add hints for strerror

Add proper hints for implicit declaration of strerror.

The results could be confusing depending on the other included headers.
These example messages are from compiling a trivial program to print the
string for an errno value. It only includes stdio.h (cstdio for C++).

Before:
$ /tmp/gcc-master/bin/gcc test.c -o test_c
test.c: In function ‘main’:
test.c:4:20: warning: implicit declaration of function ‘strerror’; did you mean ‘perror’? [-Wimplicit-function-declaration]
    4 |     printf("%s\n", strerror(0));
      |                    ^~~~~~~~
      |                    perror

$ /tmp/gcc-master/bin/g++ test.cpp -o test_cpp
test.cpp: In function ‘int main()’:
test.cpp:4:20: error: ‘strerror’ was not declared in this scope; did you mean ‘stderr’?
    4 |     printf("%s\n", strerror(0));
      |                    ^~~~~~~~
      |                    stderr

After:
$ /tmp/gcc-known-headers/bin/gcc test.c -o test_c
test.c: In function ‘main’:
test.c:4:20: warning: implicit declaration of function ‘strerror’ [-Wimplicit-function-declaration]
    4 |     printf("%s\n", strerror(0));
      |                    ^~~~~~~~
test.c:2:1: note: ‘strerror’ is defined in header ‘<string.h>’; this is probably fixable by adding ‘#include <string.h>’
    1 | #include <stdio.h>
  +++ |+#include <string.h>
    2 |

$ /tmp/gcc-known-headers/bin/g++ test.cpp -o test_cpp
test.cpp: In function ‘int main()’:
test.cpp:4:20: error: ‘strerror’ was not declared in this scope
    4 |     printf("%s\n", strerror(0));
      |                    ^~~~~~~~
test.cpp:2:1: note: ‘strerror’ is defined in header ‘<cstring>’; this is probably fixable by adding ‘#include <cstring>’
    1 | #include <cstdio>
  +++ |+#include <cstring>
    2 |

gcc/c-family/ChangeLog:

* known-headers.cc (get_stdlib_header_for_name): Add strerror.

gcc/testsuite/ChangeLog:

* g++.dg/spellcheck-stdlib.C: Add check for strerror.
* gcc.dg/spellcheck-stdlib-2.c: New test.

Signed-off-by: Oskari Pirhonen <xxc3ncoredxx@gmail.com>
gcc/c-family/known-headers.cc
gcc/testsuite/g++.dg/spellcheck-stdlib.C
gcc/testsuite/gcc.dg/spellcheck-stdlib-2.c [new file with mode: 0644]