https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84897
Bug ID: 84897 Summary: Better handling of unqualified "string" Product: gcc Version: 8.0 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: dmalcolm at gcc dot gnu.org Reporter: dmalcolm at gcc dot gnu.org Target Milestone: --- Reddit user "Boojum" suggested: > As far as other paper cuts, here's one that catches me > surprisingly frequently: #include <string> int main() { string x("foo"); } > Obviously, I "forgot" to either qualify string as std::string, > add using namespace std;, or add using std::string;. > > Here's what GCC 7.2 tells me (header paths elided): namespace.cpp: In function ‘int main()’: namespace.cpp:3:5: error: ‘string’ was not declared in this scope string x("foo"); ^~~~~~ namespace.cpp:3:5: note: suggested alternatives: In file included from .../string:39:0, from namespace.cpp:1: .../stringfwd.h:74:33: note: ‘std::__cxx11::string’ typedef basic_string<char> string; ^~~~~~ .../stringfwd.h:74:33: note: ‘std::__cxx11::string’ > On the other hand, here's what Clang 6 tells me: namespace.cpp:3:5: error: unknown type name 'string'; did you mean 'std::string'? string x("foo"); ^~~~~~ std::string .../stringfwd.h:74:33: note: 'std::string' declared here typedef basic_string<char> string; ^ 1 error generated. > Much nicer. It tells me exactly which namespace I probably > meant to use and proposes a fix-it qualifying the identifier. I hope to fix this for gcc 9. I'm not yet sure if we want to: (a) look in "std" when handling such errors (which requires the user to have included the pertinent header), or (b) to special-case important "std::" names like "string", or (c) both (d) rework the priority of the "look in namespaces" search relative to our other heuristics ...etc