From ef07d61bcbbfd3947beb3f66b2c2468a5a701722 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Wed, 31 Aug 2005 10:32:54 +0000 Subject: [PATCH] re PR c++/13377 (unexpected behavior of namespace usage directive) PR c++/13377 * parser.c (cp_parser_lookup_name): Pass LOOKUP_COMPLAIN to lookup_name_real on final parse. * g++.dg/lookup/ambig4.C: New test. * g++.dg/lookup/ambig5.C: New test. * g++.dg/tc1/dr101.C: Adjust error markers. From-SVN: r103667 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 10 ++++++---- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/lookup/ambig4.C | 14 ++++++++++++++ gcc/testsuite/g++.dg/lookup/ambig5.C | 13 +++++++++++++ gcc/testsuite/g++.dg/tc1/dr101.C | 4 ++-- 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/ambig4.C create mode 100644 gcc/testsuite/g++.dg/lookup/ambig5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cc6a9696873e..aa8ce8917e1c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-08-31 Volker Reichelt + + PR c++/13377 + * parser.c (cp_parser_lookup_name): Pass LOOKUP_COMPLAIN to + lookup_name_real on final parse. + 2005-08-31 Volker Reichelt PR c++/23639 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bebdfcbb5fe7..f6b5381f5a3c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14464,9 +14464,13 @@ cp_parser_lookup_name (cp_parser *parser, tree name, bool check_dependency, bool *ambiguous_p) { + int flags = 0; tree decl; tree object_type = parser->context->object_type; + if (!cp_parser_uncommitted_to_tentative_parse_p (parser)) + flags |= LOOKUP_COMPLAIN; + /* Assume that the lookup will be unambiguous. */ if (ambiguous_p) *ambiguous_p = false; @@ -14599,8 +14603,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name, /* Look it up in the enclosing context, too. */ decl = lookup_name_real (name, tag_type != none_type, /*nonclass=*/0, - /*block_p=*/true, is_namespace, - /*flags=*/0); + /*block_p=*/true, is_namespace, flags); parser->object_scope = object_type; parser->qualifying_scope = NULL_TREE; if (object_decl) @@ -14610,8 +14613,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name, { decl = lookup_name_real (name, tag_type != none_type, /*nonclass=*/0, - /*block_p=*/true, is_namespace, - /*flags=*/0); + /*block_p=*/true, is_namespace, flags); parser->qualifying_scope = NULL_TREE; parser->object_scope = NULL_TREE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e457ae40d42b..5fbdb9e01fbe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-08-31 Volker Reichelt + + PR c++/13377 + * g++.dg/lookup/ambig4.C: New test. + * g++.dg/lookup/ambig5.C: New test. + * g++.dg/tc1/dr101.C: Adjust error markers. + 2005-08-31 Volker Reichelt PR c++/23639 diff --git a/gcc/testsuite/g++.dg/lookup/ambig4.C b/gcc/testsuite/g++.dg/lookup/ambig4.C new file mode 100644 index 000000000000..ab1a14518d59 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig4.C @@ -0,0 +1,14 @@ +// PR c++/13377 +// Origin: Volker Reichelt +// { dg-do compile } + +namespace N +{ + int i; // { dg-error "declared" } +} + +int i; // { dg-error "declared" } + +using namespace N; + +void foo() { i; } // { dg-error "in this scope|ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig5.C b/gcc/testsuite/g++.dg/lookup/ambig5.C new file mode 100644 index 000000000000..8f74efc75184 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig5.C @@ -0,0 +1,13 @@ +// PR c++/13377 +// Origin: Boris Kolpackov +// { dg-do compile } + +namespace N +{ + namespace M {} // { dg-error "declared" } +} + +namespace M {} // { dg-error "declared" } + +using namespace N; +using namespace M; // { dg-error "namespace-name|ambiguous" } diff --git a/gcc/testsuite/g++.dg/tc1/dr101.C b/gcc/testsuite/g++.dg/tc1/dr101.C index ede2215601f0..8d9cab518b9b 100644 --- a/gcc/testsuite/g++.dg/tc1/dr101.C +++ b/gcc/testsuite/g++.dg/tc1/dr101.C @@ -17,10 +17,10 @@ namespace Test1 { namespace Test2 { - typedef unsigned int X; + typedef unsigned int X; // { dg-bogus "declared" "" { xfail *-*-* } } extern "C" int f2(); namespace N { - typedef unsigned int X; + typedef unsigned int X; // { dg-bogus "declared" "" { xfail *-*-* } } extern "C" int f2(); } using namespace N;