[PATCH] c++: give suggestion on misspelled class name [PR116771]
David Malcolm
dmalcolm@redhat.com
Fri Nov 22 21:56:08 GMT 2024
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
OK for trunk?
gcc/cp/ChangeLog:
PR c++/116771
* parser.cc (cp_parser_name_lookup_error): Provide suggestions for
the case of complete failure where there is no scope.
gcc/testsuite/ChangeLog:
PR c++/116771
* g++.dg/spellcheck-pr116771.C: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
---
gcc/cp/parser.cc | 16 +++++++++++++++-
gcc/testsuite/g++.dg/spellcheck-pr116771.C | 9 +++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/spellcheck-pr116771.C
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index ed10f58422ea..06ee36e6727c 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -3399,7 +3399,21 @@ cp_parser_name_lookup_error (cp_parser* parser,
error_at (location, "%<%T::%E%> has not been declared",
parser->object_scope, name);
else
- error_at (location, "%qE has not been declared", name);
+ {
+ auto_diagnostic_group d;
+ name_hint hint
+ = lookup_name_fuzzy (name, FUZZY_LOOKUP_TYPENAME, location);
+ if (const char *suggestion = hint.suggestion ())
+ {
+ gcc_rich_location richloc (location);
+ richloc.add_fixit_replace (suggestion);
+ error_at (&richloc,
+ "%qE has not been declared; did you mean %qs?",
+ name, suggestion);
+ }
+ else
+ error_at (location, "%qE has not been declared", name);
+ }
}
else if (parser->scope && parser->scope != global_namespace)
{
diff --git a/gcc/testsuite/g++.dg/spellcheck-pr116771.C b/gcc/testsuite/g++.dg/spellcheck-pr116771.C
new file mode 100644
index 000000000000..fd8bd6d46cbd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/spellcheck-pr116771.C
@@ -0,0 +1,9 @@
+class layout_printer
+{
+ void print_newline ();
+};
+
+void
+layout_pirnter::print_newline () // { dg-error "'layout_pirnter' has not been declared; did you mean 'layout_printer'" }
+{
+}
--
2.26.3
More information about the Gcc-patches
mailing list