aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c3
-rw-r--r--gcc/cp/parser.c11
-rw-r--r--gcc/testsuite/g++.dg/lookup/missing-std-include-4.C2
-rw-r--r--gcc/testsuite/g++.dg/lookup/missing-std-include-5.C2
5 files changed, 23 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 89680a2..5495dc1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9f65c4d..62ea564 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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>. */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 6e4c243..891f742 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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
index 0000000..abf4e96
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/missing-std-include-4.C
@@ -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
index 0000000..fe880a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/missing-std-include-5.C
@@ -0,0 +1,2 @@
+using namespace std::complex_literals; // { dg-error "" }
+// { dg-message "#include <complex>" "" { target *-*-* } .-1 }