re PR c/71858 (Surprising suggestions for misspellings)

PR c/71858
	* c-common.h (enum lookup_name_fuzzy_kind): Add
	FUZZY_LOOKUP_FUNCTION_NAME.

	* c-decl.c (implicit_decl_warning): Use FUZZY_LOOKUP_FUNCTION_NAME
	instead of FUZZY_LOOKUP_NAME.
	(lookup_name_fuzzy): For FUZZY_LOOKUP_FUNCTION_NAME consider
	FUNCTION_DECLs, {VAR,PARM}_DECLs function pointers and macros.

	* gcc.dg/spellcheck-identifiers-3.c: New test.

From-SVN: r238369
This commit is contained in:
Jakub Jelinek 2016-07-15 12:40:39 +02:00 committed by Jakub Jelinek
parent 29eb509ccb
commit ddbbcb1981
6 changed files with 92 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2016-07-15 Jakub Jelinek <jakub@redhat.com>
PR c/71858
* c-common.h (enum lookup_name_fuzzy_kind): Add
FUZZY_LOOKUP_FUNCTION_NAME.
2016-07-08 Jason Merrill <jason@redhat.com>
P0145: Refining Expression Order for C++.

View File

@ -994,6 +994,9 @@ enum lookup_name_fuzzy_kind {
/* Names of types. */
FUZZY_LOOKUP_TYPENAME,
/* Names of function decls. */
FUZZY_LOOKUP_FUNCTION_NAME,
/* Any name. */
FUZZY_LOOKUP_NAME
};

View File

@ -1,3 +1,11 @@
2016-07-15 Jakub Jelinek <jakub@redhat.com>
PR c/71858
* c-decl.c (implicit_decl_warning): Use FUZZY_LOOKUP_FUNCTION_NAME
instead of FUZZY_LOOKUP_NAME.
(lookup_name_fuzzy): For FUZZY_LOOKUP_FUNCTION_NAME consider
FUNCTION_DECLs, {VAR,PARM}_DECLs function pointers and macros.
2016-07-14 Jakub Jelinek <jakub@redhat.com>
PR c/71858

View File

@ -3090,7 +3090,7 @@ implicit_decl_warning (location_t loc, tree id, tree olddecl)
bool warned;
tree hint = NULL_TREE;
if (!olddecl)
hint = lookup_name_fuzzy (id, FUZZY_LOOKUP_NAME);
hint = lookup_name_fuzzy (id, FUZZY_LOOKUP_FUNCTION_NAME);
if (flag_isoc99)
if (hint)
@ -4028,9 +4028,30 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind)
if (TREE_CODE (binding->decl) == FUNCTION_DECL)
if (C_DECL_IMPLICIT (binding->decl))
continue;
if (kind == FUZZY_LOOKUP_TYPENAME)
if (TREE_CODE (binding->decl) != TYPE_DECL)
continue;
switch (kind)
{
case FUZZY_LOOKUP_TYPENAME:
if (TREE_CODE (binding->decl) != TYPE_DECL)
continue;
break;
case FUZZY_LOOKUP_FUNCTION_NAME:
if (TREE_CODE (binding->decl) != FUNCTION_DECL)
{
/* Allow function pointers. */
if ((VAR_P (binding->decl)
|| TREE_CODE (binding->decl) == PARM_DECL)
&& TREE_CODE (TREE_TYPE (binding->decl)) == POINTER_TYPE
&& (TREE_CODE (TREE_TYPE (TREE_TYPE (binding->decl)))
== FUNCTION_TYPE))
break;
continue;
}
break;
default:
break;
}
bm.consider (binding->id);
}

View File

@ -1,3 +1,8 @@
2016-07-15 Jakub Jelinek <jakub@redhat.com>
PR c/71858
* gcc.dg/spellcheck-identifiers-3.c: New test.
2016-07-15 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/71807

View File

@ -0,0 +1,45 @@
/* PR c/71858 */
/* Only consider function names, function pointers and macros for implicit function declarations. */
/* { dg-do compile } */
/* { dg-options "-Wimplicit-function-declaration -fdiagnostics-show-caret" } */
void fn1abcd (void);
void
test_1 (int fn1bacd)
{
fn1badc (); /* { dg-warning "3: implicit declaration of function .fn1badc.; did you mean .fn1abcd.?" } */
/* { dg-begin-multiline-output "" }
fn1badc ();
^~~~~~~
fn1abcd
{ dg-end-multiline-output "" } */
}
void fn2efgh (void);
void (*fn2efhg) (void);
void
test_2 (void)
{
fn2fehg (); /* { dg-warning "3: implicit declaration of function .fn2fehg.; did you mean .fn2efhg.?" } */
/* { dg-begin-multiline-output "" }
fn2fehg ();
^~~~~~~
fn2efhg
{ dg-end-multiline-output "" } */
}
void fn3ijkl (void);
typedef int fn3ijlk;
void
test_3 (void)
{
fn3jilk (); /* { dg-warning "3: implicit declaration of function .fn3jilk.; did you mean .fn3ijkl.?" } */
/* { dg-begin-multiline-output "" }
fn3jilk ();
^~~~~~~
fn3ijkl
{ dg-end-multiline-output "" } */
}