aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog10
-rw-r--r--gcc/c/c-decl.c82
2 files changed, 14 insertions, 78 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index b60a8e7..95b7718 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,5 +1,15 @@
2017-11-20 David Malcolm <dmalcolm@redhat.com>
+ PR c/81404
+ * c-decl.c: Include "c-family/known-headers.h".
+ (get_c_name_hint): Rename to get_stdlib_header_for_name and move
+ to known-headers.cc.
+ (class suggest_missing_header): Move to known-header.h.
+ (lookup_name_fuzzy): Call get_c_stdlib_header_for_name rather
+ than get_c_name_hint.
+
+2017-11-20 David Malcolm <dmalcolm@redhat.com>
+
* c-decl.c (get_c_name_hint): New function.
(class suggest_missing_header): New class.
(lookup_name_fuzzy): Call get_c_name_hint and use it to
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index ae45e9a..e0a4dd1 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see
#include "gcc-rich-location.h"
#include "asan.h"
#include "c-family/name-hint.h"
+#include "c-family/known-headers.h"
/* In grokdeclarator, distinguish syntactic contexts of declarators. */
enum decl_context
@@ -3992,83 +3993,6 @@ lookup_name_in_scope (tree name, struct c_scope *scope)
return NULL_TREE;
}
-/* Subroutine of lookup_name_fuzzy for handling unrecognized names
- for some of the most common names within the C standard library.
- Given non-NULL NAME, return the header name defining it within the C
- standard library (with '<' and '>'), or NULL. */
-
-static const char *
-get_c_name_hint (const char *name)
-{
- struct std_name_hint
- {
- const char *name;
- const char *header;
- };
- static const std_name_hint hints[] = {
- /* <errno.h>. */
- {"errno", "<errno.h>"},
-
- /* <stdarg.h>. */
- {"va_list", "<stdarg.h>"},
-
- /* <stddef.h>. */
- {"NULL", "<stddef.h>"},
- {"ptrdiff_t", "<stddef.h>"},
- {"wchar_t", "<stddef.h>"},
- {"size_t", "<stddef.h>"},
-
- /* <stdio.h>. */
- {"BUFSIZ", "<stdio.h>"},
- {"EOF", "<stdio.h>"},
- {"FILE", "<stdio.h>"},
- {"FILENAME_MAX", "<stdio.h>"},
- {"fpos_t", "<stdio.h>"},
- {"stderr", "<stdio.h>"},
- {"stdin", "<stdio.h>"},
- {"stdout", "<stdio.h>"}
- };
- const size_t num_hints = sizeof (hints) / sizeof (hints[0]);
- for (size_t i = 0; i < num_hints; i++)
- {
- if (0 == strcmp (name, hints[i].name))
- return hints[i].header;
- }
- return NULL;
-}
-
-/* Subclass of deferred_diagnostic for suggesting to the user
- that they have missed a #include. */
-
-class suggest_missing_header : public deferred_diagnostic
-{
- public:
- suggest_missing_header (location_t loc, const char *name,
- const char *header_hint)
- : deferred_diagnostic (loc), m_name_str (name), m_header_hint (header_hint)
- {
- gcc_assert (name);
- gcc_assert (header_hint);
- }
-
- ~suggest_missing_header ()
- {
- if (is_suppressed_p ())
- return;
-
- gcc_rich_location richloc (get_location ());
- maybe_add_include_fixit (&richloc, m_header_hint);
- inform (&richloc,
- "%qs is defined in header %qs;"
- " did you forget to %<#include %s%>?",
- m_name_str, m_header_hint, m_header_hint);
- }
-
- private:
- const char *m_name_str;
- const char *m_header_hint;
-};
-
/* Look for the closest match for NAME within the currently valid
scopes.
@@ -4094,7 +4018,9 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind, location_t loc)
/* First, try some well-known names in the C standard library, in case
the user forgot a #include. */
- const char *header_hint = get_c_name_hint (IDENTIFIER_POINTER (name));
+ const char *header_hint
+ = get_c_stdlib_header_for_name (IDENTIFIER_POINTER (name));
+
if (header_hint)
return name_hint (NULL,
new suggest_missing_header (loc,