diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-16 17:42:23 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-16 17:42:23 +0000 |
commit | 708340034c7a8f9acddf56d1068351bbb409d565 (patch) | |
tree | 6613a62722d8d1cf1c1310d7824ae8798f773352 | |
parent | 1e5911a98f7733c3263a6c9dee5ab3ff06dbf57c (diff) | |
download | gcc-708340034c7a8f9acddf56d1068351bbb409d565.tar.gz |
/cp
2014-05-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51640
* parser.c (cp_parser_diagnose_invalid_type_name): Early return
when cp_parser_lookup_name sets ambiguous_decls.
/testsuite
2014-05-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51640
* g++.dg/parse/error54.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210521 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error54.C | 19 |
4 files changed, 40 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5a13125e513..2714cd3e9bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-05-16 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51640 + * parser.c (cp_parser_diagnose_invalid_type_name): Early return + when cp_parser_lookup_name sets ambiguous_decls. + 2014-05-15 Jason Merrill <jason@redhat.com> * call.c (print_conversion_rejection): Use loc consistently. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index dae4393d6e2..7d9f81d314f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2880,13 +2880,21 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id, location_t location) { - tree decl, old_scope; + tree decl, old_scope, ambiguous_decls; cp_parser_commit_to_tentative_parse (parser); /* Try to lookup the identifier. */ old_scope = parser->scope; parser->scope = scope; - decl = cp_parser_lookup_name_simple (parser, id, location); + decl = cp_parser_lookup_name (parser, id, none_type, + /*is_template=*/false, + /*is_namespace=*/false, + /*check_dependency=*/true, + &ambiguous_decls, location); parser->scope = old_scope; + if (ambiguous_decls) + /* If the lookup was ambiguous, an error will already have + been issued. */ + return; /* If the lookup found a template-name, it means that the user forgot to specify an argument list. Emit a useful error message. */ if (TREE_CODE (decl) == TEMPLATE_DECL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7254012ba3e..0b1d9050532 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-05-16 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51640 + * g++.dg/parse/error54.C: New. + 2014-05-16 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/60969 diff --git a/gcc/testsuite/g++.dg/parse/error54.C b/gcc/testsuite/g++.dg/parse/error54.C new file mode 100644 index 00000000000..b49c76b0057 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error54.C @@ -0,0 +1,19 @@ +// PR c++/51640 + +class ex {}; + +namespace t +{ + class ex2 : public ex {}; +} + +class ex2 : public ex {}; + +void bar() +{ + using namespace t; + + try { + } catch (ex2&) { // { dg-error "reference to 'ex2' is ambiguous" } + } +} |