On 06/30/2016 12:53 PM, David Malcolm wrote:
This is a port of the C frontend's r237714 [1] to the C++ frontend:
  https://gcc.gnu.org/ml/gcc-patches/2016-06/msg01052.html
offering spelling suggestions for misspelled identifiers, macro names,
and some keywords (e.g. "singed" vs "signed" aka PR c/70339).

Unlike the C frontend, there doesn't seem to be an easy way to
distinguish between cases where we're expecting a typename vs
a variable name, so some of the logic is a little different.

Examples of suggestions can be seen in the test case.

Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu
(in combination with the prior patch); adds 240 PASS results to
g++.sum.

OK for trunk?

Dave

[1] aka 8469aece13814deddf2cd80538d33c2d0a8d60d9 in the git mirror

gcc/c/ChangeLog:
        PR c/70339
        * c-decl.c (struct edit_distance_traits<cpp_hashnode *>): Move to
        spellcheck-tree.h
        (best_macro_match): Likewise, converting from a typedef to a
        subclass.
        (find_closest_macro_cpp_cb): Move to spellcheck-tree.c.
        (lookup_name_fuzzy): Update for change of best_macro_match to a
        subclass with a ctor that calls cpp_forall_identifiers.
These are fine.


gcc/cp/ChangeLog:
        PR c/70339
        * name-lookup.c: Include gcc-rich-location.h, spellcheck-tree.h,
        and parser.h.
        (suggest_alternatives_for): If no candidates are found, try
        lookup_name_fuzzy and report if if finds a suggestion.
        (consider_binding_level): New function.
        (consider_binding_levels): New function.
        (lookup_name_fuzzy) New function.
        * parser.c: Include gcc-rich-location.h.
        (cp_lexer_next_token_is_decl_specifier_keyword): Move most of
        logic into...
        (cp_keyword_starts_decl_specifier_p): ...this new function.
        (cp_parser_diagnose_invalid_type_name): When issuing
        "does not name a type" errors, attempt to make a suggestion using
        lookup_name_fuzzy.
        * parser.h (cp_keyword_starts_decl_specifier_p): New prototype.
        * search.c (lookup_field_fuzzy_info::fuzzy_lookup_field): Don't
        attempt to access TYPE_FIELDS within a TYPE_PACK_EXPANSION.
Going to let Jason on this part.


gcc/ChangeLog:
        PR c/70339
        * diagnostic-show-locus.c (diagnostic_show_locus): If this is the
        same location as last time, don't skip if we have fix-it hints.
        Clarify the skipping logic by converting it from one "if" clause
        to repeated "if" clauses.
        * spellcheck-tree.c: Include "cpplib.h".
        (find_closest_macro_cpp_cb): Move here from c/c-decl.c.
        (best_macro_match::best_macro_match): New constructor.
        * spellcheck-tree.h (struct edit_distance_traits<cpp_hashnode *>):
        Move here from c/c-decl.c.
        (class best_macro_match): Move here from c/c-decl.c, converting
        from a typedef to a subclass, gaining a ctor.
OK.


gcc/testsuite/ChangeLog:
        PR c/70339
        * g++.dg/spellcheck-identifiers.C: New test case, based on
        gcc.dg/spellcheck-identifiers.c.
        * g++.dg/spellcheck-typenames.C: New test case, based on
        gcc.dg/spellcheck-typenames.c
OK


jeff

Reply via email to