aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2017-08-18 18:12:47 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2017-08-18 18:12:47 +0000
commitf661e57ee8fef0b121ec2d79f9e5fea20932c2ae (patch)
treeecb7f9ac9fda8d6d73edb72948e0924569ec7397 /gcc
parent676c4146f504d5252df1a3fb39bb5c4099bc0791 (diff)
downloadgcc-f661e57ee8fef0b121ec2d79f9e5fea20932c2ae.zip
gcc-f661e57ee8fef0b121ec2d79f9e5fea20932c2ae.tar.gz
gcc-f661e57ee8fef0b121ec2d79f9e5fea20932c2ae.tar.bz2
C++: fix ordering of missing std #include suggestion (PR c++/81514)
gcc/cp/ChangeLog: PR c++/81514 * name-lookup.c (maybe_suggest_missing_header): Convert return type from void to bool; return true iff a suggestion was offered. (suggest_alternative_in_explicit_scope): Move call to maybe_suggest_missing_header to before use of best_match, and return true if the former offers a suggestion. gcc/testsuite/ChangeLog: PR c++/81514 * g++.dg/lookup/empty.h: New file. * g++.dg/lookup/missing-std-include-2.C: Replace include of stdio.h with empty.h and a declaration of a "std::sprintf" not based on a built-in. From-SVN: r251186
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/name-lookup.c39
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/lookup/empty.h1
-rw-r--r--gcc/testsuite/g++.dg/lookup/missing-std-include-2.C11
5 files changed, 46 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 427d9f3..72a05547 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2017-08-18 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/81514
+ * name-lookup.c (maybe_suggest_missing_header): Convert return
+ type from void to bool; return true iff a suggestion was offered.
+ (suggest_alternative_in_explicit_scope): Move call to
+ maybe_suggest_missing_header to before use of best_match, and
+ return true if the former offers a suggestion.
+
2017-08-18 H.J. Lu <hongjiu.lu@intel.com>
PR c/53037
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 4dc19da..0aad178 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -4838,34 +4838,34 @@ get_std_name_hint (const char *name)
return NULL;
}
-/* Subroutine of suggest_alternative_in_explicit_scope, for use when we have no
- suggestions to offer.
- If SCOPE is the "std" namespace, then suggest pertinent header
- files for NAME. */
+/* If SCOPE is the "std" namespace, then suggest pertinent header
+ files for NAME at LOCATION.
+ Return true iff a suggestion was offered. */
-static void
+static bool
maybe_suggest_missing_header (location_t location, tree name, tree scope)
{
if (scope == NULL_TREE)
- return;
+ return false;
if (TREE_CODE (scope) != NAMESPACE_DECL)
- return;
+ return false;
/* We only offer suggestions for the "std" namespace. */
if (scope != std_node)
- return;
+ return false;
gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
const char *name_str = IDENTIFIER_POINTER (name);
const char *header_hint = get_std_name_hint (name_str);
- if (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);
- }
+ if (!header_hint)
+ return false;
+
+ 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);
+ return true;
}
/* Look for alternatives for NAME, an IDENTIFIER_NODE for which name
@@ -4880,6 +4880,9 @@ suggest_alternative_in_explicit_scope (location_t location, tree name,
/* Resolve any namespace aliases. */
scope = ORIGINAL_NAMESPACE (scope);
+ if (maybe_suggest_missing_header (location, name, scope))
+ return true;
+
cp_binding_level *level = NAMESPACE_LEVEL (scope);
best_match <tree, const char *> bm (name);
@@ -4895,8 +4898,6 @@ suggest_alternative_in_explicit_scope (location_t location, tree name,
fuzzy_name);
return true;
}
- else
- maybe_suggest_missing_header (location, name, scope);
return false;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bcf2495..d21f64f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2017-08-18 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/81514
+ * g++.dg/lookup/empty.h: New file.
+ * g++.dg/lookup/missing-std-include-2.C: Replace include of
+ stdio.h with empty.h and a declaration of a "std::sprintf" not based
+ on a built-in.
+
2017-08-18 H.J. Lu <hongjiu.lu@intel.com>
PR c/53037
diff --git a/gcc/testsuite/g++.dg/lookup/empty.h b/gcc/testsuite/g++.dg/lookup/empty.h
new file mode 100644
index 0000000..a057418
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/empty.h
@@ -0,0 +1 @@
+/* empty file for use by missing-std-include-2.C. */
diff --git a/gcc/testsuite/g++.dg/lookup/missing-std-include-2.C b/gcc/testsuite/g++.dg/lookup/missing-std-include-2.C
index ae918f8..51c604a 100644
--- a/gcc/testsuite/g++.dg/lookup/missing-std-include-2.C
+++ b/gcc/testsuite/g++.dg/lookup/missing-std-include-2.C
@@ -6,7 +6,12 @@
/* This is padding (to avoid the generated patch containing DejaGnu
directives). */
-#include <stdio.h>
+#include "empty.h"
+
+namespace std
+{
+ extern int sprintf (char *dst, const char *format, ...);
+};
void test (void)
{
@@ -45,11 +50,11 @@ void test_2 (void)
@@ -7,6 +7,8 @@
directives). */
- #include <stdio.h>
+ #include "empty.h"
+#include <string>
+#include <iostream>
- void test (void)
+ namespace std
{
{ dg-end-multiline-output "" }
#endif