diff options
author | Oskari Pirhonen <xxc3ncoredxx@gmail.com> | 2024-02-27 19:13:30 -0600 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-05-29 09:02:00 -0400 |
commit | 19c491d1848a8410559247183597096778967edf (patch) | |
tree | 700557c3d6b5e703d767c20b3b84701afc270540 | |
parent | f46eaad445e680034df51bd0dec4e6c7b1f372a4 (diff) | |
download | gcc-19c491d1848a8410559247183597096778967edf.zip gcc-19c491d1848a8410559247183597096778967edf.tar.gz gcc-19c491d1848a8410559247183597096778967edf.tar.bz2 |
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>
-rw-r--r-- | gcc/c-family/known-headers.cc | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/spellcheck-stdlib.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/spellcheck-stdlib-2.c | 8 |
3 files changed, 11 insertions, 0 deletions
diff --git a/gcc/c-family/known-headers.cc b/gcc/c-family/known-headers.cc index dbc42ea..871fd71 100644 --- a/gcc/c-family/known-headers.cc +++ b/gcc/c-family/known-headers.cc @@ -182,6 +182,7 @@ get_stdlib_header_for_name (const char *name, enum stdlib lib) {"strchr", {"<string.h>", "<cstring>"} }, {"strcmp", {"<string.h>", "<cstring>"} }, {"strcpy", {"<string.h>", "<cstring>"} }, + {"strerror", {"<string.h>", "<cstring>"} }, {"strlen", {"<string.h>", "<cstring>"} }, {"strncat", {"<string.h>", "<cstring>"} }, {"strncmp", {"<string.h>", "<cstring>"} }, diff --git a/gcc/testsuite/g++.dg/spellcheck-stdlib.C b/gcc/testsuite/g++.dg/spellcheck-stdlib.C index fd0f3a9..33718b8 100644 --- a/gcc/testsuite/g++.dg/spellcheck-stdlib.C +++ b/gcc/testsuite/g++.dg/spellcheck-stdlib.C @@ -104,6 +104,8 @@ void test_cstring (char *dest, char *src) // { dg-message "'#include <cstring>'" "" { target *-*-* } .-1 } strcpy(dest, "test"); // { dg-error "was not declared" } // { dg-message "'#include <cstring>'" "" { target *-*-* } .-1 } + strerror(0); // { dg-error "was not declared" } + // { dg-message "'#include <cstring>'" "" { target *-*-* } .-1 } strlen("test"); // { dg-error "was not declared" } // { dg-message "'#include <cstring>'" "" { target *-*-* } .-1 } strncat(dest, "test", 3); // { dg-error "was not declared" } diff --git a/gcc/testsuite/gcc.dg/spellcheck-stdlib-2.c b/gcc/testsuite/gcc.dg/spellcheck-stdlib-2.c new file mode 100644 index 0000000..4762e2d --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-stdlib-2.c @@ -0,0 +1,8 @@ +/* { dg-options "-Wimplicit-function-declaration" } */ + +/* Missing <string.h>. */ +void test_string_h (void) +{ + strerror (0); /* { dg-error "implicit declaration of function 'strerror'" } */ + /* { dg-message "'strerror' is defined in header '<string.h>'" "" { target *-*-* } .-1 } */ +} |