+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++.
/* Names of types. */
FUZZY_LOOKUP_TYPENAME,
+ /* Names of function decls. */
+ FUZZY_LOOKUP_FUNCTION_NAME,
+
/* Any name. */
FUZZY_LOOKUP_NAME
};
+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
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)
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);
}
+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
--- /dev/null
+/* 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 "" } */
+}