aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family/c-common.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-08-18 18:52:43 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-08-18 18:52:43 +0000
commitcb18fd07f2962779c2651adc970541210d4ad98f (patch)
treeb325fd07e1c9c2f08551326602a989303e28ddfd /gcc/c-family/c-common.c
parenta76989dc7c9236214856db196da88a739f0e7baa (diff)
downloadgcc-cb18fd07f2962779c2651adc970541210d4ad98f.zip
gcc-cb18fd07f2962779c2651adc970541210d4ad98f.tar.gz
gcc-cb18fd07f2962779c2651adc970541210d4ad98f.tar.bz2
Spelling suggestions for misspelled preprocessor directives
This patch allows the preprocessor to offer suggestions for misspelled directives, taking us from e.g.: test.c:5:2: error: invalid preprocessing directive #endfi #endfi ^~~~~ to: test.c:5:2: error: invalid preprocessing directive #endfi; did you mean #endif? #endfi ^~~~~ endif gcc/c-family/ChangeLog: * c-common.c: Include "spellcheck.h". (cb_get_suggestion): New function. * c-common.h (cb_get_suggestion): New decl. * c-lex.c (init_c_lex): Initialize cb->get_suggestion to cb_get_suggestion. gcc/testsuite/ChangeLog: * gcc.dg/cpp/misspelled-directive-1.c: New testcase. * gcc.dg/cpp/misspelled-directive-2.c: New testcase. libcpp/ChangeLog: * directives.c (directive_names): New array. (_cpp_handle_directive): Offer spelling suggestions for misspelled directives. * errors.c (cpp_diagnostic_at_richloc): New function. (cpp_error_at_richloc): New function. * include/cpplib.h (struct cpp_callbacks): Add field "get_suggestion". (cpp_error_at_richloc): New decl. From-SVN: r239585
Diffstat (limited to 'gcc/c-family/c-common.c')
-rw-r--r--gcc/c-family/c-common.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 22e3844..9082883 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see
#include "opts.h"
#include "gimplify.h"
#include "substring-locations.h"
+#include "spellcheck.h"
cpp_reader *parse_in; /* Declared in c-pragma.h. */
@@ -12948,6 +12949,22 @@ cb_get_source_date_epoch (cpp_reader *pfile ATTRIBUTE_UNUSED)
return (time_t) epoch;
}
+/* Callback for libcpp for offering spelling suggestions for misspelled
+ directives. GOAL is an unrecognized string; CANDIDATES is a
+ NULL-terminated array of candidate strings. Return the closest
+ match to GOAL within CANDIDATES, or NULL if none are good
+ suggestions. */
+
+const char *
+cb_get_suggestion (cpp_reader *, const char *goal,
+ const char *const *candidates)
+{
+ best_match<const char *, const char *> bm (goal);
+ while (*candidates)
+ bm.consider (*candidates++);
+ return bm.get_best_meaningful_candidate ();
+}
+
/* Check and possibly warn if two declarations have contradictory
attributes, such as always_inline vs. noinline. */