diff options
author | Mark Wielaard <mark@klomp.org> | 2020-05-20 00:55:00 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2020-05-22 23:22:30 +0200 |
commit | af114c38db819a6fea3e024c5143aaea7f9d33d4 (patch) | |
tree | 8e3a2c9a3cdc3758bb4c6e29702d42c62dbdffb0 /gcc | |
parent | 45c50b6a63a120d3eb6957883c4c7b968c84d010 (diff) | |
download | gcc-af114c38db819a6fea3e024c5143aaea7f9d33d4.zip gcc-af114c38db819a6fea3e024c5143aaea7f9d33d4.tar.gz gcc-af114c38db819a6fea3e024c5143aaea7f9d33d4.tar.bz2 |
Suggest including <stdint.h> or <cstdint> for [u]int[8|16|32|64]_t
Plus [u]intptr_t and associated constants.
Refactor the bool, true, false, <stdbool.h> code so it fits into the
new table based design.
gcc/c-family/ChangeLog:
* known-headers.cc (get_stdlib_header_for_name): Add a new
stdlib_hint array for stdbool and stdint.
gcc/testsuite/ChangeLog:
* gcc.dg/spellcheck-stdint.c: New test.
* g++.dg/spellcheck-stdint.C: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/known-headers.cc | 42 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/spellcheck-stdint.C | 68 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/spellcheck-stdint.c | 62 |
5 files changed, 176 insertions, 6 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 4218403..0ec2b96 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,5 +1,10 @@ 2020-05-22 Mark Wielaard <mark@klomp.org> + * known-headers.cc (get_stdlib_header_for_name): Add a new + stdlib_hint array for stdbool and stdint. + +2020-05-22 Mark Wielaard <mark@klomp.org> + * known-headers.cc (get_stdlib_header_for_name): Return "<stdbool.h>" for "bool", "true" or "false" when STDLIB_C and flag_isoc99. diff --git a/gcc/c-family/known-headers.cc b/gcc/c-family/known-headers.cc index 183ce28..1e2bf49 100644 --- a/gcc/c-family/known-headers.cc +++ b/gcc/c-family/known-headers.cc @@ -159,12 +159,42 @@ get_stdlib_header_for_name (const char *name, enum stdlib lib) if (strcmp (name, hints[i].name) == 0) return hints[i].header[lib]; - /* Only for C99 and higher. */ - if (lib == STDLIB_C && flag_isoc99) - if (strcmp (name, "bool") == 0 - || strcmp (name, "true") == 0 - || strcmp (name, "false") == 0) - return "<stdbool.h>"; + static const stdlib_hint c99_cxx11_hints[] = { + /* <stdbool.h>. Defined natively in C++. */ + {"bool", {"<stdbool.h>", NULL} }, + {"true", {"<stdbool.h>", NULL} }, + {"false", {"<stdbool.h>", NULL} }, + + /* <stdint.h> and <cstdint>. */ + {"int8_t", {"<stdint.h>", "<cstdint>"} }, + {"uint8_t", {"<stdint.h>", "<cstdint>"} }, + {"int16_t", {"<stdint.h>", "<cstdint>"} }, + {"uint16_t", {"<stdint.h>", "<cstdint>"} }, + {"int32_t", {"<stdint.h>", "<cstdint>"} }, + {"uint32_t", {"<stdint.h>", "<cstdint>"} }, + {"int64_t", {"<stdint.h>", "<cstdint>"} }, + {"uint64_t", {"<stdint.h>", "<cstdint>"} }, + {"intptr_t", {"<stdint.h>", "<cstdint>"} }, + {"uintptr_t", {"<stdint.h>", "<cstdint>"} }, + {"INT8_MAX", {"<stdint.h>", "<cstdint>"} }, + {"INT16_MAX", {"<stdint.h>", "<cstdint>"} }, + {"INT32_MAX", {"<stdint.h>", "<cstdint>"} }, + {"INT64_MAX", {"<stdint.h>", "<cstdint>"} }, + {"UINT8_MAX", {"<stdint.h>", "<cstdint>"} }, + {"UINT16_MAX", {"<stdint.h>", "<cstdint>"} }, + {"UINT32_MAX", {"<stdint.h>", "<cstdint>"} }, + {"UINT64_MAX", {"<stdint.h>", "<cstdint>"} }, + {"INTPTR_MAX", {"<stdint.h>", "<cstdint>"} }, + {"UINTPTR_MAX", {"<stdint.h>", "<cstdint>"} } + }; + + const size_t num_c99_cxx11_hints = sizeof (c99_cxx11_hints) + / sizeof (c99_cxx11_hints[0]); + if ((lib == STDLIB_C && flag_isoc99) + || (lib == STDLIB_CPLUSPLUS && cxx_dialect >= cxx11 )) + for (size_t i = 0; i < num_c99_cxx11_hints; i++) + if (strcmp (name, c99_cxx11_hints[i].name) == 0) + return c99_cxx11_hints[i].header[lib]; return NULL; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb3a2d1..9711a27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2020-05-22 Mark Wielaard <mark@klomp.org> + * gcc.dg/spellcheck-stdint.c: New test. + * g++.dg/spellcheck-stdint.C: Likewise. + +2020-05-22 Mark Wielaard <mark@klomp.org> + * gcc.dg/spellcheck-stdbool.c: New test. 2020-05-22 Mark Wielaard <mark@klomp.org> diff --git a/gcc/testsuite/g++.dg/spellcheck-stdint.C b/gcc/testsuite/g++.dg/spellcheck-stdint.C new file mode 100644 index 0000000..b9ce3b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/spellcheck-stdint.C @@ -0,0 +1,68 @@ +/* { dg-options "-std=c++11" } */ +/* Missing <cstdint>. */ + +char c = INT8_MAX; // { dg-error "'INT8_MAX' was not declared" } +// { dg-message "'INT8_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + +short s = INT16_MAX; // { dg-error "'INT16_MAX' was not declared" } +// { dg-message "'INT16_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + +int i = INT32_MAX; // { dg-error "'INT32_MAX' was not declared" } +// { dg-message "'INT32_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + +long l = INT64_MAX; // { dg-error "'INT64_MAX' was not declared" } +// { dg-message "'INT64_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + +intptr_t test_intptr (void) // { dg-error "'intptr_t' does not name a type" } +// { dg-message "'intptr_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +{ + return 0; +} + +int test_intptr_max (void) +{ + return (int) INTPTR_MAX; // { dg-error "'INTPTR_MAX' was not declared" } +// { dg-message "'INTPTR_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +} + +uintptr_t test_uintptr (void) // { dg-error "'uintptr_t' does not name a type" } +// { dg-message "'uintptr_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +{ + return 0; +} + +unsigned int test_uintptr_max (void) +{ + return (unsigned int) UINTPTR_MAX; // { dg-error "'UINTPTR_MAX' was not declared" } +// { dg-message "'UINTPTR_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +} + +int8_t i8; // { dg-error "'int8_t' does not name a type" } +// { dg-message "'int8_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +int16_t i16; // { dg-error "'int16_t' does not name a type" } +// { dg-message "'int16_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +int32_t i32; // { dg-error "'int32_t' does not name a type" } +// { dg-message "'int32_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +int64_t i64; // { dg-error "'int64_t' does not name a type" } +// { dg-message "'int64_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + +void test_uint_t (void) +{ + char bu8[(unsigned int)UINT8_MAX]; // { dg-error "'UINT8_MAX' was not declared" } + // { dg-message "'UINT8_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + char bu16[(unsigned int)UINT16_MAX]; // { dg-error "'UINT16_MAX' was not declared" } + // { dg-message "'UINT16_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + char bu32[(unsigned int)UINT32_MAX]; // { dg-error "'UINT32_MAX' was not declared" } + // { dg-message "'UINT32_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + char bu64[(unsigned int)UINT64_MAX]; // { dg-error "'UINT64_MAX' was not declared" } + // { dg-message "'UINT64_MAX' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + + auto ui8 = (uint8_t) 8; // { dg-error "'uint8_t' was not declared" } + // { dg-message "'uint8_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + auto ui16 = (uint16_t) 16; // { dg-error "'uint16_t' was not declared" } + // { dg-message "'uint16_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + auto ui32 = (uint32_t) 32; // { dg-error "'uint32_t' was not declared" } + // { dg-message "'uint32_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } + auto ui64 = (uint64_t) 64; // { dg-error "'uint64_t' was not declared" } + // { dg-message "'uint64_t' is defined in header '<cstdint>'; did you forget to '#include <cstdint>'?" "" { target *-*-* } .-1 } +} diff --git a/gcc/testsuite/gcc.dg/spellcheck-stdint.c b/gcc/testsuite/gcc.dg/spellcheck-stdint.c new file mode 100644 index 0000000..852c869 --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-stdint.c @@ -0,0 +1,62 @@ +/* { dg-options "-std=gnu99" } */ +/* Missing <stdint.h>. */ + +char c = INT8_MAX; // { dg-error "'INT8_MAX' undeclared" } +// { dg-message "'INT8_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + +short s = INT16_MAX; // { dg-error "'INT16_MAX' undeclared" } +// { dg-message "'INT16_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + +int i = INT32_MAX; // { dg-error "'INT32_MAX' undeclared" } +// { dg-message "'INT32_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + +long l = INT64_MAX; // { dg-error "'INT64_MAX' undeclared" } +// { dg-message "'INT64_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + +intptr_t test_intptr (void) // { dg-error "unknown type name 'intptr_t'" } +// { dg-message "'intptr_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +{ + return INTPTR_MAX; // { dg-error "'INTPTR_MAX' undeclared" } +// { dg-message "'INTPTR_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +} + +uintptr_t test_uintptr (void) // { dg-error "unknown type name 'uintptr_t'" } +// { dg-message "'uintptr_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +{ + return UINTPTR_MAX; // { dg-error "'UINTPTR_MAX' undeclared" } +// { dg-message "'UINTPTR_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +} + +int8_t i8; // { dg-error "unknown type name 'int8_t'" } +// { dg-message "'int8_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +int16_t i16; // { dg-error "unknown type name 'int16_t'" } +// { dg-message "'int16_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +int32_t i32; // { dg-error "unknown type name 'int32_t'" } +// { dg-message "'int32_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } +int64_t i64; // { dg-error "unknown type name 'int64_t'" } +// { dg-message "'int64_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + +void test_uint_t (void) +{ + char bu8[(unsigned int)UINT8_MAX]; // { dg-error "'UINT8_MAX' undeclared" } + // { dg-message "'UINT8_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + char bu16[(unsigned int)UINT16_MAX]; // { dg-error "'UINT16_MAX' undeclared" } + // { dg-message "'UINT16_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + char bu32[(unsigned int)UINT32_MAX]; // { dg-error "'UINT32_MAX' undeclared" } + // { dg-message "'UINT32_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + char bu64[(unsigned int)UINT64_MAX]; // { dg-error "'UINT64_MAX' undeclared" } + // { dg-message "'UINT64_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-1 } + + char ui8 = (uint8_t) 8; // { dg-error "'uint8_t' undeclared" } + // { dg-error "expected" "" { target *-*-* } .-1 } + // { dg-message "'uint8_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-2 } + short ui16 = (uint16_t) 16; // { dg-error "'uint16_t' undeclared" } + // { dg-error "expected" "" { target *-*-* } .-1 } + // { dg-message "'uint16_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-2 } + int ui32 = (uint32_t) 32; // { dg-error "'uint32_t' undeclared" } + // { dg-error "expected" "" { target *-*-* } .-1 } + // { dg-message "'uint32_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-2 } + long ui64 = (uint64_t) 64; // { dg-error "'uint64_t' undeclared" } + // { dg-error "expected" "" { target *-*-* } .-1 } + // { dg-message "'uint64_t' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?" "" { target *-*-* } .-2 } +} |