From ddbbcb1981b4f7c8ee18f4aecaf84c2cb2d98e2e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 15 Jul 2016 12:40:39 +0200 Subject: [PATCH] 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 --- gcc/c-family/ChangeLog | 6 ++++ gcc/c-family/c-common.h | 3 ++ gcc/c/ChangeLog | 8 +++++ gcc/c/c-decl.c | 29 +++++++++++++--- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c | 45 +++++++++++++++++++++++++ 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 9c002f6..46e4509 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-07-15 Jakub Jelinek + + PR c/71858 + * c-common.h (enum lookup_name_fuzzy_kind): Add + FUZZY_LOOKUP_FUNCTION_NAME. + 2016-07-08 Jason Merrill P0145: Refining Expression Order for C++. diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 3ad5400..0f068e6 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -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 }; diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 6d35693..968d942 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,11 @@ +2016-07-15 Jakub Jelinek + + 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 PR c/71858 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index e2e0f64..955c0e8 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5ad50f9..939fef3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-15 Jakub Jelinek + + PR c/71858 + * gcc.dg/spellcheck-identifiers-3.c: New test. + 2016-07-15 Andre Vehreschild PR fortran/71807 diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c new file mode 100644 index 0000000..94f4078 --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c @@ -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 "" } */ +} -- 2.7.4