From: Mark Wielaard Date: Tue, 19 May 2020 22:55:00 +0000 (+0200) Subject: Suggest including or for [u]int[8|16|32|64]_t X-Git-Tag: misc/first-auto-changelog~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af114c38db819a6fea3e024c5143aaea7f9d33d4;p=thirdparty%2Fgcc.git Suggest including or for [u]int[8|16|32|64]_t Plus [u]intptr_t and associated constants. Refactor the bool, true, false, 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. --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 421840397533..0ec2b9662a8e 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2020-05-22 Mark Wielaard + + * known-headers.cc (get_stdlib_header_for_name): Add a new + stdlib_hint array for stdbool and stdint. + 2020-05-22 Mark Wielaard * 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 183ce2834afd..1e2bf49c439a 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 ""; + static const stdlib_hint c99_cxx11_hints[] = { + /* . Defined natively in C++. */ + {"bool", {"", NULL} }, + {"true", {"", NULL} }, + {"false", {"", NULL} }, + + /* and . */ + {"int8_t", {"", ""} }, + {"uint8_t", {"", ""} }, + {"int16_t", {"", ""} }, + {"uint16_t", {"", ""} }, + {"int32_t", {"", ""} }, + {"uint32_t", {"", ""} }, + {"int64_t", {"", ""} }, + {"uint64_t", {"", ""} }, + {"intptr_t", {"", ""} }, + {"uintptr_t", {"", ""} }, + {"INT8_MAX", {"", ""} }, + {"INT16_MAX", {"", ""} }, + {"INT32_MAX", {"", ""} }, + {"INT64_MAX", {"", ""} }, + {"UINT8_MAX", {"", ""} }, + {"UINT16_MAX", {"", ""} }, + {"UINT32_MAX", {"", ""} }, + {"UINT64_MAX", {"", ""} }, + {"INTPTR_MAX", {"", ""} }, + {"UINTPTR_MAX", {"", ""} } + }; + + 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 cb3a2d1fa6fa..9711a27e29c0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-22 Mark Wielaard + + * gcc.dg/spellcheck-stdint.c: New test. + * g++.dg/spellcheck-stdint.C: Likewise. + 2020-05-22 Mark Wielaard * 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 000000000000..b9ce3b7aed81 --- /dev/null +++ b/gcc/testsuite/g++.dg/spellcheck-stdint.C @@ -0,0 +1,68 @@ +/* { dg-options "-std=c++11" } */ +/* Missing . */ + +char c = INT8_MAX; // { dg-error "'INT8_MAX' was not declared" } +// { dg-message "'INT8_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +short s = INT16_MAX; // { dg-error "'INT16_MAX' was not declared" } +// { dg-message "'INT16_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +int i = INT32_MAX; // { dg-error "'INT32_MAX' was not declared" } +// { dg-message "'INT32_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +long l = INT64_MAX; // { dg-error "'INT64_MAX' was not declared" } +// { dg-message "'INT64_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +intptr_t test_intptr (void) // { dg-error "'intptr_t' does not name a type" } +// { dg-message "'intptr_t' is defined in header ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +} + +uintptr_t test_uintptr (void) // { dg-error "'uintptr_t' does not name a type" } +// { dg-message "'uintptr_t' is defined in header ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +} + +int8_t i8; // { dg-error "'int8_t' does not name a type" } +// { dg-message "'int8_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int16_t i16; // { dg-error "'int16_t' does not name a type" } +// { dg-message "'int16_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int32_t i32; // { dg-error "'int32_t' does not name a type" } +// { dg-message "'int32_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int64_t i64; // { dg-error "'int64_t' does not name a type" } +// { dg-message "'int64_t' is defined in header ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu16[(unsigned int)UINT16_MAX]; // { dg-error "'UINT16_MAX' was not declared" } + // { dg-message "'UINT16_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu32[(unsigned int)UINT32_MAX]; // { dg-error "'UINT32_MAX' was not declared" } + // { dg-message "'UINT32_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu64[(unsigned int)UINT64_MAX]; // { dg-error "'UINT64_MAX' was not declared" } + // { dg-message "'UINT64_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + + auto ui8 = (uint8_t) 8; // { dg-error "'uint8_t' was not declared" } + // { dg-message "'uint8_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + auto ui16 = (uint16_t) 16; // { dg-error "'uint16_t' was not declared" } + // { dg-message "'uint16_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + auto ui32 = (uint32_t) 32; // { dg-error "'uint32_t' was not declared" } + // { dg-message "'uint32_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + auto ui64 = (uint64_t) 64; // { dg-error "'uint64_t' was not declared" } + // { dg-message "'uint64_t' is defined in header ''; did you forget to '#include '?" "" { 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 000000000000..852c86954b6a --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-stdint.c @@ -0,0 +1,62 @@ +/* { dg-options "-std=gnu99" } */ +/* Missing . */ + +char c = INT8_MAX; // { dg-error "'INT8_MAX' undeclared" } +// { dg-message "'INT8_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +short s = INT16_MAX; // { dg-error "'INT16_MAX' undeclared" } +// { dg-message "'INT16_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +int i = INT32_MAX; // { dg-error "'INT32_MAX' undeclared" } +// { dg-message "'INT32_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +long l = INT64_MAX; // { dg-error "'INT64_MAX' undeclared" } +// { dg-message "'INT64_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + +intptr_t test_intptr (void) // { dg-error "unknown type name 'intptr_t'" } +// { dg-message "'intptr_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +{ + return INTPTR_MAX; // { dg-error "'INTPTR_MAX' undeclared" } +// { dg-message "'INTPTR_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +} + +uintptr_t test_uintptr (void) // { dg-error "unknown type name 'uintptr_t'" } +// { dg-message "'uintptr_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +{ + return UINTPTR_MAX; // { dg-error "'UINTPTR_MAX' undeclared" } +// { dg-message "'UINTPTR_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +} + +int8_t i8; // { dg-error "unknown type name 'int8_t'" } +// { dg-message "'int8_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int16_t i16; // { dg-error "unknown type name 'int16_t'" } +// { dg-message "'int16_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int32_t i32; // { dg-error "unknown type name 'int32_t'" } +// { dg-message "'int32_t' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } +int64_t i64; // { dg-error "unknown type name 'int64_t'" } +// { dg-message "'int64_t' is defined in header ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu16[(unsigned int)UINT16_MAX]; // { dg-error "'UINT16_MAX' undeclared" } + // { dg-message "'UINT16_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu32[(unsigned int)UINT32_MAX]; // { dg-error "'UINT32_MAX' undeclared" } + // { dg-message "'UINT32_MAX' is defined in header ''; did you forget to '#include '?" "" { target *-*-* } .-1 } + char bu64[(unsigned int)UINT64_MAX]; // { dg-error "'UINT64_MAX' undeclared" } + // { dg-message "'UINT64_MAX' is defined in header ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { 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 ''; did you forget to '#include '?" "" { target *-*-* } .-2 } +}