Re: [PATCH] Suggest including for bool, true and false

2020-05-22 Thread David Malcolm via Gcc-patches
On Tue, 2020-05-19 at 23:36 +0200, Mark Wielaard wrote:
> Currently gcc suggests to use _Bool instead of bool and doesn't give
> any suggestions when true or false are used, but undefined. This
> patch
> makes it so that (for C99 or higher) a fixit hint is emitted to
> include
> .

[...snip...]

Looks good to me.

Thanks
Dave




[PATCH] Suggest including for bool, true and false

2020-05-19 Thread Mark Wielaard
Currently gcc suggests to use _Bool instead of bool and doesn't give
any suggestions when true or false are used, but undefined. This patch
makes it so that (for C99 or higher) a fixit hint is emitted to include
.

gcc/c-family/ChangeLog:

* known-headers.cc (get_stdlib_header_for_name): Return
" for "bool", "true" or "false" when STDLIB_C and
flag_isoc99.

gcc/testsuite/ChangeLog:

* gcc.dg/spellcheck-stdbool.c: New test.
---
 gcc/c-family/known-headers.cc |  8 
 gcc/testsuite/gcc.dg/spellcheck-stdbool.c | 17 +
 2 files changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/spellcheck-stdbool.c

diff --git a/gcc/c-family/known-headers.cc b/gcc/c-family/known-headers.cc
index a21166860c0f..183ce2834afd 100644
--- a/gcc/c-family/known-headers.cc
+++ b/gcc/c-family/known-headers.cc
@@ -158,6 +158,14 @@ get_stdlib_header_for_name (const char *name, enum stdlib 
lib)
   for (size_t i = 0; i < num_hints; i++)
 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 "";
+
   return NULL;
 }
 
diff --git a/gcc/testsuite/gcc.dg/spellcheck-stdbool.c 
b/gcc/testsuite/gcc.dg/spellcheck-stdbool.c
new file mode 100644
index ..01f12da35cfe
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/spellcheck-stdbool.c
@@ -0,0 +1,17 @@
+/* { dg-options "-std=c99" } */
+/* Missing .  */
+
+bool b; /* { dg-error "unknown type name 'bool'" } */
+/* { dg-message "'bool' is defined in header ''; did you forget to 
'#include '?" "" { target *-*-* } .-1 } */
+
+int test_true (void)
+{
+  return true; /* { dg-error "'true' undeclared" } */
+  /* { dg-message "'true' is defined in header ''; did you forget 
to '#include '?" "" { target *-*-* } .-1 } */
+}
+
+int test_false (void)
+{
+  return false; /* { dg-error "'false' undeclared" } */
+  /* { dg-message "'false' is defined in header ''; did you forget 
to '#include '?" "" { target *-*-* } .-1 } */
+}
-- 
2.20.1