C++: fix ordering of missing std #include suggestion (PR c++/81514)
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 18 Aug 2017 18:12:47 +0000 (18:12 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Fri, 18 Aug 2017 18:12:47 +0000 (18:12 +0000)
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

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/empty.h [new file with mode: 0644]
gcc/testsuite/g++.dg/lookup/missing-std-include-2.C

index 427d9f3acc7f4db00f2f27f910db43f294c4be10..72a05547ed2db5df3097ecb4f312b8cc378b2231 100644 (file)
@@ -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
index 4dc19da6ade795470ba92bf60784ab482ab00845..0aad17885c78b0c087744d551b41f2d642ab1763 100644 (file)
@@ -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;
 }
index bcf24952e057985c1d80e00e5ff8bc505ec8e46a..d21f64fcc0f61cd122ce6bbea84eadbd04675792 100644 (file)
@@ -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 (file)
index 0000000..a057418
--- /dev/null
@@ -0,0 +1 @@
+/* empty file for use by missing-std-include-2.C.  */
index ae918f869a73250ca1b640bff3c0bdfd27fe94ca..51c604a9f1e2afc667a244e566d41cd34f5c78f1 100644 (file)
@@ -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