Mercurial > hg > CbC > CbC_gcc
diff gcc/c-family/known-headers.cc @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children | 1830386684a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/c-family/known-headers.cc Thu Oct 25 07:37:49 2018 +0900 @@ -0,0 +1,200 @@ +/* Support for suggestions about missing #include directives. + Copyright (C) 2017-2018 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#define INCLUDE_UNIQUE_PTR +#include "system.h" +#include "coretypes.h" +#include "c-family/c-common.h" +#include "c-family/name-hint.h" +#include "c-family/known-headers.h" +#include "gcc-rich-location.h" + +/* An enum for distinguishing between the C and C++ stdlibs. */ + +enum stdlib +{ + STDLIB_C, + STDLIB_CPLUSPLUS, + + NUM_STDLIBS +}; + +/* A struct for associating names in a standard library with the header + that should be included to locate them, for each of the C and C++ stdlibs + (or NULL, for names that aren't in a header for a particular stdlib). */ + +struct stdlib_hint +{ + const char *name; + const char *header[NUM_STDLIBS]; +}; + +/* Given non-NULL NAME, return the header name defining it within either + the standard library (with '<' and '>'), or NULL. + Only handles a subset of the most common names within the stdlibs. */ + +static const char * +get_stdlib_header_for_name (const char *name, enum stdlib lib) +{ + gcc_assert (name); + gcc_assert (lib < NUM_STDLIBS); + + static const stdlib_hint hints[] = { + /* <assert.h> and <cassert>. */ + {"assert", {"<assert.h>", "<cassert>"} }, + + /* <errno.h> and <cerrno>. */ + {"errno", {"<errno.h>", "<cerrno>"} }, + + /* <limits.h> and <climits>. */ + {"CHAR_BIT", {"<limits.h>", "<climits>"} }, + {"CHAR_MAX", {"<limits.h>", "<climits>"} }, + {"CHAR_MIN", {"<limits.h>", "<climits>"} }, + {"INT_MAX", {"<limits.h>", "<climits>"} }, + {"INT_MIN", {"<limits.h>", "<climits>"} }, + {"LLONG_MAX", {"<limits.h>", "<climits>"} }, + {"LLONG_MIN", {"<limits.h>", "<climits>"} }, + {"LONG_MAX", {"<limits.h>", "<climits>"} }, + {"LONG_MIN", {"<limits.h>", "<climits>"} }, + {"MB_LEN_MAX", {"<limits.h>", "<climits>"} }, + {"SCHAR_MAX", {"<limits.h>", "<climits>"} }, + {"SCHAR_MIN", {"<limits.h>", "<climits>"} }, + {"SHRT_MAX", {"<limits.h>", "<climits>"} }, + {"SHRT_MIN", {"<limits.h>", "<climits>"} }, + {"UCHAR_MAX", {"<limits.h>", "<climits>"} }, + {"UINT_MAX", {"<limits.h>", "<climits>"} }, + {"ULLONG_MAX", {"<limits.h>", "<climits>"} }, + {"ULONG_MAX", {"<limits.h>", "<climits>"} }, + {"USHRT_MAX", {"<limits.h>", "<climits>"} }, + + /* <stdarg.h> and <cstdarg>. */ + {"va_list", {"<stdarg.h>", "<cstdarg>"} }, + + /* <stddef.h> and <cstddef>. */ + {"NULL", {"<stddef.h>", "<cstddef>"} }, + {"nullptr_t", {NULL, "<cstddef>"} }, + {"offsetof", {"<stddef.h>", "<cstddef>"} }, + {"ptrdiff_t", {"<stddef.h>", "<cstddef>"} }, + {"size_t", {"<stddef.h>", "<cstddef>"} }, + {"wchar_t", {"<stddef.h>", NULL /* a keyword in C++ */} }, + + /* <stdio.h> and <cstdio>. */ + {"BUFSIZ", {"<stdio.h>", "<cstdio>"} }, + {"EOF", {"<stdio.h>", "<cstdio>"} }, + {"FILE", {"<stdio.h>", "<cstdio>"} }, + {"FILENAME_MAX", {"<stdio.h>", "<cstdio>"} }, + {"fopen", {"<stdio.h>", "<cstdio>"} }, + {"fpos_t", {"<stdio.h>", "<cstdio>"} }, + {"getchar", {"<stdio.h>", "<cstdio>"} }, + {"printf", {"<stdio.h>", "<cstdio>"} }, + {"snprintf", {"<stdio.h>", "<cstdio>"} }, + {"sprintf", {"<stdio.h>", "<cstdio>"} }, + {"stderr", {"<stdio.h>", "<cstdio>"} }, + {"stdin", {"<stdio.h>", "<cstdio>"} }, + {"stdout", {"<stdio.h>", "<cstdio>"} }, + + /* <stdlib.h> and <cstdlib>. */ + {"free", {"<stdlib.h>", "<cstdlib>"} }, + {"malloc", {"<stdlib.h>", "<cstdlib>"} }, + {"realloc", {"<stdlib.h>", "<cstdlib>"} }, + + /* <string.h> and <cstring>. */ + {"memchr", {"<string.h>", "<cstring>"} }, + {"memcmp", {"<string.h>", "<cstring>"} }, + {"memcpy", {"<string.h>", "<cstring>"} }, + {"memmove", {"<string.h>", "<cstring>"} }, + {"memset", {"<string.h>", "<cstring>"} }, + {"strcat", {"<string.h>", "<cstring>"} }, + {"strchr", {"<string.h>", "<cstring>"} }, + {"strcmp", {"<string.h>", "<cstring>"} }, + {"strcpy", {"<string.h>", "<cstring>"} }, + {"strlen", {"<string.h>", "<cstring>"} }, + {"strncat", {"<string.h>", "<cstring>"} }, + {"strncmp", {"<string.h>", "<cstring>"} }, + {"strncpy", {"<string.h>", "<cstring>"} }, + {"strrchr", {"<string.h>", "<cstring>"} }, + {"strspn", {"<string.h>", "<cstring>"} }, + {"strstr", {"<string.h>", "<cstring>"} }, + + /* <stdint.h>. */ + {"PTRDIFF_MAX", {"<stdint.h>", "<cstdint>"} }, + {"PTRDIFF_MIN", {"<stdint.h>", "<cstdint>"} }, + {"SIG_ATOMIC_MAX", {"<stdint.h>", "<cstdint>"} }, + {"SIG_ATOMIC_MIN", {"<stdint.h>", "<cstdint>"} }, + {"SIZE_MAX", {"<stdint.h>", "<cstdint>"} }, + {"WINT_MAX", {"<stdint.h>", "<cstdint>"} }, + {"WINT_MIN", {"<stdint.h>", "<cstdint>"} }, + + /* <wchar.h>. */ + {"WCHAR_MAX", {"<wchar.h>", "<cwchar>"} }, + {"WCHAR_MIN", {"<wchar.h>", "<cwchar>"} } + }; + const size_t num_hints = sizeof (hints) / sizeof (hints[0]); + for (size_t i = 0; i < num_hints; i++) + if (strcmp (name, hints[i].name) == 0) + return hints[i].header[lib]; + return NULL; +} + +/* Given non-NULL NAME, return the header name defining it within the C + standard library (with '<' and '>'), or NULL. */ + +const char * +get_c_stdlib_header_for_name (const char *name) +{ + return get_stdlib_header_for_name (name, STDLIB_C); +} + +/* Given non-NULL NAME, return the header name defining it within the C++ + standard library (with '<' and '>'), or NULL. */ + +const char * +get_cp_stdlib_header_for_name (const char *name) +{ + return get_stdlib_header_for_name (name, STDLIB_CPLUSPLUS); +} + +/* Implementation of class suggest_missing_header. */ + +/* suggest_missing_header's ctor. */ + +suggest_missing_header::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's dtor. */ + +suggest_missing_header::~suggest_missing_header () +{ + if (is_suppressed_p ()) + return; + + gcc_rich_location richloc (get_location ()); + maybe_add_include_fixit (&richloc, m_header_hint, true); + inform (&richloc, + "%qs is defined in header %qs;" + " did you forget to %<#include %s%>?", + m_name_str, m_header_hint, m_header_hint); +}