diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-07-14 15:09:00 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-07-14 15:09:00 +0000 |
commit | eea77d1f3437366004a5d47efdf6b9cdbf3fcfbb (patch) | |
tree | 91bce65baf3294434588bd452b06ed508518e076 /gcc/cp | |
parent | bcf198440546aa583cf86ddce458a4bd26f616f0 (diff) | |
download | gcc-eea77d1f3437366004a5d47efdf6b9cdbf3fcfbb.zip gcc-eea77d1f3437366004a5d47efdf6b9cdbf3fcfbb.tar.gz gcc-eea77d1f3437366004a5d47efdf6b9cdbf3fcfbb.tar.bz2 |
c/c++: Add fix-it hints for suggested missing #includes
gcc/c-family/ChangeLog:
* c-common.c (try_to_locate_new_include_insertion_point): New
function.
(per_file_includes_t): New typedef.
(added_includes_t): New typedef.
(added_includes): New variable.
(maybe_add_include_fixit): New function.
* c-common.h (maybe_add_include_fixit): New decl.
gcc/c/ChangeLog:
* c-decl.c (implicitly_declare): When suggesting a missing
#include, provide a fix-it hint.
gcc/cp/ChangeLog:
* name-lookup.c (get_std_name_hint): Add '<' and '>' around
the header names.
(maybe_suggest_missing_header): Update for addition of '<' and '>'
to above. Provide a fix-it hint.
* pt.c: Include "gcc-rich-location.h"
(listify): Attempt to add fix-it hint for missing
#include <initializer_list>.
* rtti.c: Include "gcc-rich-location.h".
(typeid_ok_p): Attempt to add fix-it hint for missing
#include <typeinfo>.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/missing-initializer_list-include.C: New test case.
* g++.dg/lookup/missing-std-include-2.C: New test case.
* g++.dg/lookup/missing-std-include-3.C: New test case.
* g++.dg/rtti/missing-typeinfo-include.C: New test case.
* gcc.dg/missing-header-fixit-1.c: New test case.
* gcc.dg/missing-header-fixit-2.c: New test case.
* gcc.dg/missing-header-fixit-2.h: New header.
From-SVN: r250203
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 94 | ||||
-rw-r--r-- | gcc/cp/pt.c | 9 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 8 |
4 files changed, 76 insertions, 48 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 02214c9..715ac76 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2017-07-14 David Malcolm <dmalcolm@redhat.com> + + * name-lookup.c (get_std_name_hint): Add '<' and '>' around + the header names. + (maybe_suggest_missing_header): Update for addition of '<' and '>' + to above. Provide a fix-it hint. + * pt.c: Include "gcc-rich-location.h" + (listify): Attempt to add fix-it hint for missing + #include <initializer_list>. + * rtti.c: Include "gcc-rich-location.h". + (typeid_ok_p): Attempt to add fix-it hint for missing + #include <typeinfo>. + 2017-07-12 Jason Merrill <jason@redhat.com> P0512R0 - Deduction from an initializer list. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index fcf06e0..cd7428a 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4760,7 +4760,7 @@ suggest_alternatives_for (location_t location, tree name, /* Subroutine of maybe_suggest_missing_header for handling unrecognized names for some of the most common names within "std::". Given non-NULL NAME, a name for lookup within "std::", return the header - name defining it within the C++ Standard Library (without '<' and '>'), + name defining it within the C++ Standard Library (with '<' and '>'), or NULL. */ static const char * @@ -4773,61 +4773,61 @@ get_std_name_hint (const char *name) }; static const std_name_hint hints[] = { /* <array>. */ - {"array", "array"}, // C++11 + {"array", "<array>"}, // C++11 /* <deque>. */ - {"deque", "deque"}, + {"deque", "<deque>"}, /* <forward_list>. */ - {"forward_list", "forward_list"}, // C++11 + {"forward_list", "<forward_list>"}, // C++11 /* <fstream>. */ - {"basic_filebuf", "fstream"}, - {"basic_ifstream", "fstream"}, - {"basic_ofstream", "fstream"}, - {"basic_fstream", "fstream"}, + {"basic_filebuf", "<fstream>"}, + {"basic_ifstream", "<fstream>"}, + {"basic_ofstream", "<fstream>"}, + {"basic_fstream", "<fstream>"}, /* <iostream>. */ - {"cin", "iostream"}, - {"cout", "iostream"}, - {"cerr", "iostream"}, - {"clog", "iostream"}, - {"wcin", "iostream"}, - {"wcout", "iostream"}, - {"wclog", "iostream"}, + {"cin", "<iostream>"}, + {"cout", "<iostream>"}, + {"cerr", "<iostream>"}, + {"clog", "<iostream>"}, + {"wcin", "<iostream>"}, + {"wcout", "<iostream>"}, + {"wclog", "<iostream>"}, /* <list>. */ - {"list", "list"}, + {"list", "<list>"}, /* <map>. */ - {"map", "map"}, - {"multimap", "map"}, + {"map", "<map>"}, + {"multimap", "<map>"}, /* <queue>. */ - {"queue", "queue"}, - {"priority_queue", "queue"}, + {"queue", "<queue>"}, + {"priority_queue", "<queue>"}, /* <ostream>. */ - {"ostream", "ostream"}, - {"wostream", "ostream"}, - {"ends", "ostream"}, - {"flush", "ostream"}, - {"endl", "ostream"}, + {"ostream", "<ostream>"}, + {"wostream", "<ostream>"}, + {"ends", "<ostream>"}, + {"flush", "<ostream>"}, + {"endl", "<ostream>"}, /* <set>. */ - {"set", "set"}, - {"multiset", "set"}, + {"set", "<set>"}, + {"multiset", "<set>"}, /* <sstream>. */ - {"basic_stringbuf", "sstream"}, - {"basic_istringstream", "sstream"}, - {"basic_ostringstream", "sstream"}, - {"basic_stringstream", "sstream"}, + {"basic_stringbuf", "<sstream>"}, + {"basic_istringstream", "<sstream>"}, + {"basic_ostringstream", "<sstream>"}, + {"basic_stringstream", "<sstream>"}, /* <stack>. */ - {"stack", "stack"}, + {"stack", "<stack>"}, /* <string>. */ - {"string", "string"}, - {"wstring", "string"}, - {"u16string", "string"}, - {"u32string", "string"}, + {"string", "<string>"}, + {"wstring", "<string>"}, + {"u16string", "<string>"}, + {"u32string", "<string>"}, /* <unordered_map>. */ - {"unordered_map", "unordered_map"}, // C++11 - {"unordered_multimap", "unordered_map"}, // C++11 + {"unordered_map", "<unordered_map>"}, // C++11 + {"unordered_multimap", "<unordered_map>"}, // C++11 /* <unordered_set>. */ - {"unordered_set", "unordered_set"}, // C++11 - {"unordered_multiset", "unordered_set"}, // C++11 + {"unordered_set", "<unordered_set>"}, // C++11 + {"unordered_multiset", "<unordered_set>"}, // C++11 /* <vector>. */ - {"vector", "vector"}, + {"vector", "<vector>"}, }; const size_t num_hints = sizeof (hints) / sizeof (hints[0]); for (size_t i = 0; i < num_hints; i++) @@ -4858,10 +4858,14 @@ maybe_suggest_missing_header (location_t location, tree name, tree scope) const char *name_str = IDENTIFIER_POINTER (name); const char *header_hint = get_std_name_hint (name_str); if (header_hint) - inform (location, - "%<std::%s%> is defined in header %<<%s>%>;" - " did you forget to %<#include <%s>%>?", - name_str, header_hint, header_hint); + { + gcc_rich_location richloc (location); + maybe_add_include_fixit (&richloc, header_hint); + inform_at_rich_loc (&richloc, + "%<std::%s%> is defined in header %qs;" + " did you forget to %<#include %s%>?", + name_str, header_hint, header_hint); + } } /* Look for alternatives for NAME, an IDENTIFIER_NODE for which name diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 0df6854..da133bd 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-iterator.h" #include "type-utils.h" #include "gimplify.h" +#include "gcc-rich-location.h" /* The type of functions taking a tree, and some additional data, and returning an int. */ @@ -24867,8 +24868,12 @@ listify (tree arg) if (!std_init_list || !DECL_CLASS_TEMPLATE_P (std_init_list)) { - error ("deducing from brace-enclosed initializer list requires " - "#include <initializer_list>"); + gcc_rich_location richloc (input_location); + maybe_add_include_fixit (&richloc, "<initializer_list>"); + error_at_rich_loc (&richloc, + "deducing from brace-enclosed initializer list" + " requires #include <initializer_list>"); + return error_mark_node; } tree argvec = make_tree_vec (1); diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index d73b1bc..a660cdd 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3. If not see #include "intl.h" #include "stor-layout.h" #include "c-family/c-pragma.h" +#include "gcc-rich-location.h" /* C++ returns type information to the user in struct type_info objects. We also use type information to implement dynamic_cast and @@ -316,7 +317,12 @@ typeid_ok_p (void) if (!COMPLETE_TYPE_P (const_type_info_type_node)) { - error ("must %<#include <typeinfo>%> before using %<typeid%>"); + gcc_rich_location richloc (input_location); + maybe_add_include_fixit (&richloc, "<typeinfo>"); + error_at_rich_loc (&richloc, + "must %<#include <typeinfo>%> before using" + " %<typeid%>"); + return false; } |