From: Volker Reichelt Date: Wed, 21 Sep 2005 15:08:00 +0000 (+0000) Subject: re PR c++/17609 (spurious error message after using keyword) X-Git-Tag: releases/gcc-3.4.5~183 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34d94d68069c3beeb94fc2c7d36d1f3c7a2b91a3;p=thirdparty%2Fgcc.git re PR c++/17609 (spurious error message after using keyword) PR c++/17609 Backport: 2004-03-08 Mark Mitchell * lex.c (unqualified_name_lookup_error): Create a dummy VAR_DECL in the innermost scope, rather than at namespace scope. * name-lookup.c (push_local_binding): Give it external linkage. * name-lookup.h (push_local_binding): Declare it. * g++.dg/lookup/error1.C: New test. * g++.dg/lookup/ambig4.C: Tweak error messages. * g++.dg/ext/stmtexpr4.C: Likewise. * g++.dg/parse/error21.C: Tweak testcase. Backport: 2004-03-02 Mark Mitchell * g++.dg/lookup/koenig1.C: Tweak error messages. * g++.dg/lookup/used-before-declaration.C: Likewise. * g++.dg/other/do1.C: Likewise. * g++.dg/overload/koenig1.C: Likewise. * g++.dg/parse/crash13.C: Likewise. From-SVN: r104487 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a2b7a93d1e0d..acc38cc6a386 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2005-09-21 Volker Reichelt + + PR c++/17609 + Backport: + + 2004-03-08 Mark Mitchell + * lex.c (unqualified_name_lookup_error): Create a dummy VAR_DECL + in the innermost scope, rather than at namespace scope. + * name-lookup.c (push_local_binding): Give it external linkage. + * name-lookup.h (push_local_binding): Declare it. + 2005-09-17 Volker Reichelt Backport: diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 2239c76ca873..66e45ed905a3 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -627,26 +627,18 @@ unqualified_name_lookup_error (tree name) if (name != ansi_opname (ERROR_MARK)) error ("`%D' not defined", name); } - else if (current_function_decl == 0) - error ("`%D' was not declared in this scope", name); else { - if (IDENTIFIER_NAMESPACE_VALUE (name) != error_mark_node - || IDENTIFIER_ERROR_LOCUS (name) != current_function_decl) + error ("`%D' was not declared in this scope", name); + /* Prevent repeated error messages by creating a VAR_DECL with + this NAME in the innermost block scope. */ + if (current_function_decl) { - static int undeclared_variable_notice; - - error ("`%D' undeclared (first use this function)", name); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once for each function it appears in.)"); - undeclared_variable_notice = 1; - } + tree decl; + decl = build_decl (VAR_DECL, name, error_mark_node); + DECL_CONTEXT (decl) = current_function_decl; + push_local_binding (name, decl, 0); } - /* Prevent repeated error messages. */ - SET_IDENTIFIER_NAMESPACE_VALUE (name, error_mark_node); - SET_IDENTIFIER_ERROR_LOCUS (name, current_function_decl); } return error_mark_node; diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 00a2f8f4e459..71894db10583 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -35,7 +35,6 @@ static cxx_scope *innermost_nonclass_level (void); static tree select_decl (cxx_binding *, int); static cxx_binding *binding_for_name (cxx_scope *, tree); static tree lookup_name_current_level (tree); -static void push_local_binding (tree, tree, int); static tree push_overloaded_decl (tree, int); static bool lookup_using_namespace (tree, cxx_binding *, tree, tree, int); @@ -1052,7 +1051,7 @@ maybe_push_decl (tree decl) doesn't really belong to this binding level, that it got here through a using-declaration. */ -static void +void push_local_binding (tree id, tree decl, int flags) { struct cp_binding_level *b; diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index 837757520531..1ade1a91f3f1 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -287,6 +287,7 @@ extern tree lookup_namespace_name (tree, tree); extern tree lookup_qualified_name (tree, tree, bool, bool); extern tree lookup_name_nonclass (tree); extern tree lookup_function_nonclass (tree, tree); +extern void push_local_binding (tree, tree, int); extern int push_class_binding (tree, tree); extern bool pushdecl_class_level (tree); extern tree pushdecl_namespace_level (tree); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 79dafd4cf598..186b5e5f6b63 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2005-09-21 Volker Reichelt + + PR c++/17609 + * g++.dg/lookup/error1.C: New test. + * g++.dg/lookup/ambig4.C: Tweak error messages. + * g++.dg/ext/stmtexpr4.C: Likewise. + * g++.dg/parse/error21.C: Tweak testcase. + + Backport: + 2004-03-02 Mark Mitchell + + * g++.dg/lookup/koenig1.C: Tweak error messages. + * g++.dg/lookup/used-before-declaration.C: Likewise. + * g++.dg/other/do1.C: Likewise. + * g++.dg/overload/koenig1.C: Likewise. + * g++.dg/parse/crash13.C: Likewise. + 2005-09-17 Volker Reichelt PR c++/18368 diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr4.C b/gcc/testsuite/g++.dg/ext/stmtexpr4.C index 0257939aa375..a37c33ae0863 100644 --- a/gcc/testsuite/g++.dg/ext/stmtexpr4.C +++ b/gcc/testsuite/g++.dg/ext/stmtexpr4.C @@ -4,5 +4,5 @@ void foo() { - ({x;}); // { dg-error "undeclared" } + ({x;}); // { dg-error "was not declared" } } diff --git a/gcc/testsuite/g++.dg/lookup/ambig4.C b/gcc/testsuite/g++.dg/lookup/ambig4.C index dbe53db02c9d..ab1a14518d59 100644 --- a/gcc/testsuite/g++.dg/lookup/ambig4.C +++ b/gcc/testsuite/g++.dg/lookup/ambig4.C @@ -11,4 +11,4 @@ int i; // { dg-error "declared" } using namespace N; -void foo() { i; } // { dg-error "undeclared|ambiguous" } +void foo() { i; } // { dg-error "in this scope|ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/error1.C b/gcc/testsuite/g++.dg/lookup/error1.C new file mode 100644 index 000000000000..2264b238403c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/error1.C @@ -0,0 +1,9 @@ +// PR c++/17609 +// Origin: +// { dg-do compile } + +namespace N { int i; } +void foo() { i; } // { dg-error "not declared" } + +using namespace N; +void bar() { i; } diff --git a/gcc/testsuite/g++.dg/lookup/koenig1.C b/gcc/testsuite/g++.dg/lookup/koenig1.C index 697a322e3fb6..7273727194c9 100644 --- a/gcc/testsuite/g++.dg/lookup/koenig1.C +++ b/gcc/testsuite/g++.dg/lookup/koenig1.C @@ -9,5 +9,5 @@ class X; void foo() { X x(1); // { dg-error "incomplete type" "" } - bar(x); // { dg-error "undeclared" "" } + bar(x); // { dg-error "not declared" "" } } diff --git a/gcc/testsuite/g++.dg/lookup/used-before-declaration.C b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C index c1469ead01fd..b51d270c74ab 100644 --- a/gcc/testsuite/g++.dg/lookup/used-before-declaration.C +++ b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C @@ -1,5 +1,5 @@ // Copyroght (C) 2003 Free Software Foundation // Origin: PR/12832, Jonathan Wakely -void f() { g(); } // { dg-error "undeclared" "" } -void g() { } // { dg-error "used" "" } +void f() { g(); } // { dg-error "not declared" "" } +void g() { } diff --git a/gcc/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C index 8cbd1a35f1f4..720358568f12 100644 --- a/gcc/testsuite/g++.dg/other/do1.C +++ b/gcc/testsuite/g++.dg/other/do1.C @@ -8,6 +8,6 @@ void init () { do { } while (0) - obj = 0; // { dg-error "expected|undeclared" "" } + obj = 0; // { dg-error "expected|not declared" "" } } diff --git a/gcc/testsuite/g++.dg/overload/koenig1.C b/gcc/testsuite/g++.dg/overload/koenig1.C index dd38e720acf7..1ed7bce0b146 100644 --- a/gcc/testsuite/g++.dg/overload/koenig1.C +++ b/gcc/testsuite/g++.dg/overload/koenig1.C @@ -13,6 +13,6 @@ void g () { B *bp; N::A *ap; - f (bp); // { dg-error "undeclared" } + f (bp); // { dg-error "not declared" } f (ap); } diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C index bd96bd1d6f12..3c298ec8ede5 100644 --- a/gcc/testsuite/g++.dg/parse/crash13.C +++ b/gcc/testsuite/g++.dg/parse/crash13.C @@ -18,5 +18,5 @@ void func(A::B* ) // { dg-error "variable|template|expression" } int main() { - func(0); // { dg-error "undeclared|expression|;" } + func(0); // { dg-error "not declared|expression|;" } } diff --git a/gcc/testsuite/g++.dg/parse/error21.C b/gcc/testsuite/g++.dg/parse/error21.C index 038c8b848712..c697683507f4 100644 --- a/gcc/testsuite/g++.dg/parse/error21.C +++ b/gcc/testsuite/g++.dg/parse/error21.C @@ -7,6 +7,6 @@ void foo() { // Check that we do not complain about an unused // compiler-generated variable. - A& = a; // { dg-error "token|declarator|undeclared" } + A& = 1; // { dg-error "token|declarator" } }