PR c/107583 notes that we weren't issuing a hint for struct foo { time_t mytime; /* missing <time.h> include should trigger fixit */ };
in the C frontend. The root cause is that one of the "unknown type name" diagnostics was missing logic to emit hints, which this patch fixes. Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to trunk as r14-1876-g57446d1bc9757e. gcc/c/ChangeLog: PR c/107583 * c-parser.cc (c_parser_declspecs): Add hints to "unknown type name" error. gcc/testsuite/ChangeLog: PR c/107583 * c-c++-common/spellcheck-pr107583.c: New test. --- gcc/c/c-parser.cc | 14 +++++++++++++- gcc/testsuite/c-c++-common/spellcheck-pr107583.c | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/spellcheck-pr107583.c diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 5baa501dbee..f8b14e4c688 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -3182,7 +3182,19 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, attrs_ok = true; if (kind == C_ID_ID) { - error_at (loc, "unknown type name %qE", value); + auto_diagnostic_group d; + name_hint hint = lookup_name_fuzzy (value, FUZZY_LOOKUP_TYPENAME, + loc); + if (const char *suggestion = hint.suggestion ()) + { + gcc_rich_location richloc (loc); + richloc.add_fixit_replace (suggestion); + error_at (&richloc, + "unknown type name %qE; did you mean %qs?", + value, suggestion); + } + else + error_at (loc, "unknown type name %qE", value); t.kind = ctsk_typedef; t.spec = error_mark_node; } diff --git a/gcc/testsuite/c-c++-common/spellcheck-pr107583.c b/gcc/testsuite/c-c++-common/spellcheck-pr107583.c new file mode 100644 index 00000000000..86a9e7dbcb6 --- /dev/null +++ b/gcc/testsuite/c-c++-common/spellcheck-pr107583.c @@ -0,0 +1,10 @@ +struct s1 { + time_t mytime; /* { dg-error "unknown type name 'time_t'" "c error" { target c } } */ + /* { dg-error "'time_t' does not name a type" "c++ error" { target c++ } .-1 } */ + /* { dg-message "'time_t' is defined in header" "hint" { target *-*-* } .-2 } */ +}; + +struct s2 { + unsinged i; /* { dg-error "unknown type name 'unsinged'; did you mean 'unsigned'." "c error" { target c } } */ + /* { dg-error "'unsinged' does not name a type; did you mean 'unsigned'." "c++ error" { target c++ } .-1 } */ +}; -- 2.26.3