diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 3 | ||||
-rw-r--r-- | gcc/cp/parser.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/missing-std-include-4.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/missing-std-include-5.C | 2 |
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 } |