Give #include hints for <complex>.
authorJason Merrill <jason@redhat.com>
Fri, 1 Dec 2017 20:19:13 +0000 (15:19 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 1 Dec 2017 20:19:13 +0000 (15:19 -0500)
* name-lookup.c (get_std_name_hint): Add <complex>.
* parser.c (cp_parser_diagnose_invalid_type_name): Call
suggest_alternative_in_explicit_scope.
(cp_parser_namespace_name): Likewise.

From-SVN: r255336

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

index 89680a20d6bf9fb8753da518b274488b80db367c..5495dc13c69dbf110a19eeac1b957bade073b388 100644 (file)
@@ -1,5 +1,11 @@
 2017-12-01  Jason Merrill  <jason@redhat.com>
 
+       Give #include hints for <complex>.
+       * name-lookup.c (get_std_name_hint): Add <complex>.
+       * parser.c (cp_parser_diagnose_invalid_type_name): Call
+       suggest_alternative_in_explicit_scope.
+       (cp_parser_namespace_name): Likewise.
+
        PR c++/79228 - extensions hide C++14 complex literal operators
        * parser.c (cp_parser_userdef_numeric_literal): Be helpful about
        'i' in C++14 and up.
index 9f65c4d7992738d005ceb36e48be75586ce40ff3..62ea564cedd58458b7737388e64be4e8ffa0e1a5 100644 (file)
@@ -5414,6 +5414,9 @@ get_std_name_hint (const char *name)
   static const std_name_hint hints[] = {
     /* <array>.  */
     {"array", "<array>"}, // C++11
+    /* <complex>.  */
+    {"complex", "<complex>"},
+    {"complex_literals", "<complex>"},
     /* <deque>.  */
     {"deque", "<deque>"},
     /* <forward_list>.  */
index 6e4c24362c6e6f335605c62e7c50ede5f1eb7a7a..891f742eb2159c642abde71faf6f92f58cb1c94e 100644 (file)
@@ -3365,6 +3365,9 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree id,
                      id, parser->scope);
          if (DECL_P (decl))
            inform (DECL_SOURCE_LOCATION (decl), "%qD declared here", decl);
+         else if (decl == error_mark_node)
+           suggest_alternative_in_explicit_scope (location, id,
+                                                  parser->scope);
        }
       else if (CLASS_TYPE_P (parser->scope)
               && constructor_name_p (id, parser->scope))
@@ -18408,7 +18411,13 @@ cp_parser_namespace_name (cp_parser* parser)
       || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
     {
       if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
-       error_at (token->location, "%qD is not a namespace-name", identifier);
+       {
+         error_at (token->location, "%qD is not a namespace-name", identifier);
+         if (namespace_decl == error_mark_node
+             && parser->scope && TREE_CODE (parser->scope) == NAMESPACE_DECL)
+           suggest_alternative_in_explicit_scope (token->location, identifier,
+                                                  parser->scope);
+       }
       cp_parser_error (parser, "expected namespace-name");
       namespace_decl = error_mark_node;
     }
diff --git a/gcc/testsuite/g++.dg/lookup/missing-std-include-4.C b/gcc/testsuite/g++.dg/lookup/missing-std-include-4.C
new file mode 100644 (file)
index 0000000..abf4e96
--- /dev/null
@@ -0,0 +1,2 @@
+std::complex<int> c;           // { dg-error "" }
+// { dg-message "#include <complex>" "" { target *-*-* } .-1 }
diff --git a/gcc/testsuite/g++.dg/lookup/missing-std-include-5.C b/gcc/testsuite/g++.dg/lookup/missing-std-include-5.C
new file mode 100644 (file)
index 0000000..fe880a6
--- /dev/null
@@ -0,0 +1,2 @@
+using namespace std::complex_literals; // { dg-error "" }
+// { dg-message "#include <complex>" "" { target *-*-* } .-1 }