diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 421840397533bf4866b7e5c7af1a22441b0336a7..0ec2b9662a8ef9868f39d73335c8f415818c823c 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/c-family/known-headers.cc b/gcc/c-family/known-headers.cc index 183ce2834afd707bc30b5bf3979a419c00efd99d..1e2bf49c439a449fcb3e2fc092030c8c61af955d 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 cb3a2d1fa6fa08e8fd59dfdbfd3a986c9efccb8f..9711a27e29c09d0fb52fb873b10546b739a6fc2b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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. diff --git a/gcc/testsuite/g++.dg/spellcheck-stdint.C b/gcc/testsuite/g++.dg/spellcheck-stdint.C new file mode 100644 index 0000000000000000000000000000000000000000..b9ce3b7aed8148c6b0c222eeba6eb943b917260a --- /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 0000000000000000000000000000000000000000..852c86954b6acaa3c76781e2bbb994906da40498 --- /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 } +}