aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2017-04-25 13:34:50 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2017-04-25 13:34:50 +0000
commit7d5dbb22ec8e0c1f104539d3fdf2afc5174a5b45 (patch)
treecb97cfa4afc5343f61e406a573fd5fe602802a4e
parent0f168ccca1bb7a72e5456f9a6ff82a256e774073 (diff)
downloadgcc-7d5dbb22ec8e0c1f104539d3fdf2afc5174a5b45.zip
gcc-7d5dbb22ec8e0c1f104539d3fdf2afc5174a5b45.tar.gz
gcc-7d5dbb22ec8e0c1f104539d3fdf2afc5174a5b45.tar.bz2
Fix spelling suggestions for reserved words (PR c++/80177)
gcc/cp/ChangeLog: PR c++/80177 * name-lookup.c (suggest_alternative_in_explicit_scope): Convert candidate type of bm from tree to const char *. (consider_binding_level): Likewise. (lookup_name_fuzzy): Likewise, using this to merge the best result from the preprocessor into bm, rather than immediately returning, so that better matches from reserved words can "win". Guard the rejection of keywords that don't start decl-specifiers so it only happens for FUZZY_LOOKUP_TYPENAME. gcc/testsuite/ChangeLog: PR c++/80177 * g++.dg/spellcheck-pr80177.C: New test case. From-SVN: r247233
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/name-lookup.c37
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/spellcheck-pr80177.C7
4 files changed, 40 insertions, 21 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ecdf616..b04894d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+2017-04-25 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/80177
+ * name-lookup.c (suggest_alternative_in_explicit_scope): Convert
+ candidate type of bm from tree to const char *.
+ (consider_binding_level): Likewise.
+ (lookup_name_fuzzy): Likewise, using this to merge the best
+ result from the preprocessor into bm, rather than immediately
+ returning, so that better matches from reserved words can "win".
+ Guard the rejection of keywords that don't start decl-specifiers
+ so it only happens for FUZZY_LOOKUP_TYPENAME.
+
2017-04-24 Volker Reichelt <v.reichelt@netcologne.de>
* decl.c (grokdeclarator): Use %qT instead of %<%T%> in diagnostics.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9dedad4..eda6db2 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -48,7 +48,8 @@ static bool lookup_using_namespace (tree, struct scope_binding *, tree,
tree, int);
static bool qualified_lookup_using_namespace (tree, tree,
struct scope_binding *, int);
-static void consider_binding_level (tree name, best_match <tree, tree> &bm,
+static void consider_binding_level (tree name,
+ best_match <tree, const char *> &bm,
cp_binding_level *lvl,
bool look_within_fields,
enum lookup_name_fuzzy_kind kind);
@@ -4550,14 +4551,13 @@ suggest_alternative_in_explicit_scope (location_t location, tree name,
cp_binding_level *level = NAMESPACE_LEVEL (scope);
- best_match <tree, tree> bm (name);
+ best_match <tree, const char *> bm (name);
consider_binding_level (name, bm, level, false, FUZZY_LOOKUP_NAME);
/* See if we have a good suggesion for the user. */
- tree best_id = bm.get_best_meaningful_candidate ();
- if (best_id)
+ const char *fuzzy_name = bm.get_best_meaningful_candidate ();
+ if (fuzzy_name)
{
- const char *fuzzy_name = IDENTIFIER_POINTER (best_id);
gcc_rich_location richloc (location);
richloc.add_fixit_replace (fuzzy_name);
inform_at_rich_loc (&richloc, "suggested alternative: %qs",
@@ -4797,7 +4797,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
Traverse binding level LVL, looking for good name matches for NAME
(and BM). */
static void
-consider_binding_level (tree name, best_match <tree, tree> &bm,
+consider_binding_level (tree name, best_match <tree, const char *> &bm,
cp_binding_level *lvl, bool look_within_fields,
enum lookup_name_fuzzy_kind kind)
{
@@ -4809,7 +4809,7 @@ consider_binding_level (tree name, best_match <tree, tree> &bm,
tree best_matching_field
= lookup_member_fuzzy (type, name, want_type_p);
if (best_matching_field)
- bm.consider (best_matching_field);
+ bm.consider (IDENTIFIER_POINTER (best_matching_field));
}
for (tree t = lvl->names; t; t = TREE_CHAIN (t))
@@ -4838,7 +4838,7 @@ consider_binding_level (tree name, best_match <tree, tree> &bm,
if (tree name = DECL_NAME (d))
/* Ignore internal names with spaces in them. */
if (!strchr (IDENTIFIER_POINTER (name), ' '))
- bm.consider (DECL_NAME (d));
+ bm.consider (IDENTIFIER_POINTER (name));
}
}
@@ -4851,7 +4851,7 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind)
{
gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
- best_match <tree, tree> bm (name);
+ best_match <tree, const char *> bm (name);
cp_binding_level *lvl;
for (lvl = scope_chain->class_bindings; lvl; lvl = lvl->level_chain)
@@ -4874,9 +4874,9 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind)
the identifiers already checked. */
best_macro_match bmm (name, bm.get_best_distance (), parse_in);
cpp_hashnode *best_macro = bmm.get_best_meaningful_candidate ();
- /* If a macro is the closest so far to NAME, suggest it. */
+ /* If a macro is the closest so far to NAME, consider it. */
if (best_macro)
- return (const char *)best_macro->ident.str;
+ bm.consider ((const char *)best_macro->ident.str);
/* Try the "starts_decl_specifier_p" keywords to detect
"singed" vs "signed" typos. */
@@ -4884,8 +4884,9 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind)
{
const c_common_resword *resword = &c_common_reswords[i];
- if (!cp_keyword_starts_decl_specifier_p (resword->rid))
- continue;
+ if (kind == FUZZY_LOOKUP_TYPENAME)
+ if (!cp_keyword_starts_decl_specifier_p (resword->rid))
+ continue;
tree resword_identifier = ridpointers [resword->rid];
if (!resword_identifier)
@@ -4897,16 +4898,10 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind)
if (!C_IS_RESERVED_WORD (resword_identifier))
continue;
- bm.consider (resword_identifier);
+ bm.consider (IDENTIFIER_POINTER (resword_identifier));
}
- /* See if we have a good suggesion for the user. */
- tree best_id = bm.get_best_meaningful_candidate ();
- if (best_id)
- return IDENTIFIER_POINTER (best_id);
-
- /* No meaningful suggestion available. */
- return NULL;
+ return bm.get_best_meaningful_candidate ();
}
/* Subroutine of outer_binding.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5495f78..9fce4f7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-25 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/80177
+ * g++.dg/spellcheck-pr80177.C: New test case.
+
2017-04-25 Nathan Sidwell <nathan@acm.org>
* g++.dg/dg.exp (find-cxx-tests): New function.
diff --git a/gcc/testsuite/g++.dg/spellcheck-pr80177.C b/gcc/testsuite/g++.dg/spellcheck-pr80177.C
new file mode 100644
index 0000000..2ff24e8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/spellcheck-pr80177.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+void pr80177 ()
+{
+ static_assertion (1 == 0, "1 == 0"); // { dg-error "3: 'static_assertion' was not declared in this scope" }
+ // { dg-message "3: suggested alternative: 'static_assert'" "" { target *-*-* } .-1 }
+}