summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-16 17:42:23 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-16 17:42:23 +0000
commit708340034c7a8f9acddf56d1068351bbb409d565 (patch)
tree6613a62722d8d1cf1c1310d7824ae8798f773352
parent1e5911a98f7733c3263a6c9dee5ab3ff06dbf57c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/error54.C19
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" }
+ }
+}