From 0dd7db3b2527e4d4d596f6257cfa27210c4e922d Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 15 Jul 2016 10:40:39 +0000 Subject: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238369 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c/ChangeLog | 8 ++++++++ gcc/c/c-decl.c | 29 +++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) (limited to 'gcc/c') diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 6d35693cb2f..968d942c7be 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 e2e0f640b0a..955c0e8da73 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); } -- cgit v1.2.1