diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3c1055b345e..7ce14982dd1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-04-15 Mark Mitchell + + PR c++/10381 + * parser.c (cp_parser_primary_expression): Reorganize logic for + dealing with name lookup failures. + 2003-04-15 Jason Merrill * decl2.c (mark_used): Don't instantiate anything if diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8f992c58327..751508906b1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2558,43 +2558,52 @@ cp_parser_primary_expression (cp_parser *parser, } } - if (!parser->scope - && decl == error_mark_node - && processing_template_decl) + if (decl == error_mark_node) { - /* Unqualified name lookup failed while processing a - template. */ - *idk = CP_PARSER_ID_KIND_UNQUALIFIED; - /* If the next token is a parenthesis, assume that - Koenig lookup will succeed when instantiating the - template. */ - if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) - return build_min_nt (LOOKUP_EXPR, id_expression); - /* If we're not doing Koenig lookup, issue an error. */ - error ("`%D' has not been declared", id_expression); - return error_mark_node; - } - else if (decl == error_mark_node - && !processing_template_decl) - { - if (!parser->scope) + /* Name lookup failed. */ + if (!parser->scope + && processing_template_decl) + { + /* Unqualified name lookup failed while processing a + template. */ + *idk = CP_PARSER_ID_KIND_UNQUALIFIED; + /* If the next token is a parenthesis, assume that + Koenig lookup will succeed when instantiating the + template. */ + if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) + return build_min_nt (LOOKUP_EXPR, id_expression); + /* If we're not doing Koenig lookup, issue an error. */ + error ("`%D' has not been declared", id_expression); + return error_mark_node; + } + else if (parser->scope + && (!TYPE_P (parser->scope) + || !dependent_type_p (parser->scope))) + { + /* Qualified name lookup failed, and the + qualifying name was not a dependent type. That + is always an error. */ + if (TYPE_P (parser->scope) + && !COMPLETE_TYPE_P (parser->scope)) + error ("incomplete type `%T' used in nested name " + "specifier", + parser->scope); + else if (parser->scope != global_namespace) + error ("`%D' is not a member of `%D'", + id_expression, parser->scope); + else + error ("`::%D' has not been declared", id_expression); + return error_mark_node; + } + else if (!parser->scope && !processing_template_decl) { /* It may be resolvable as a koenig lookup function call. */ *idk = CP_PARSER_ID_KIND_UNQUALIFIED; return id_expression; } - else if (TYPE_P (parser->scope) - && !COMPLETE_TYPE_P (parser->scope)) - error ("incomplete type `%T' used in nested name specifier", - parser->scope); - else if (parser->scope != global_namespace) - error ("`%D' is not a member of `%D'", - id_expression, parser->scope); - else - error ("`::%D' has not been declared", id_expression); } - /* If DECL is a variable would be out of scope under + /* If DECL is a variable that would be out of scope under ANSI/ISO rules, but in scope in the ARM, name lookup will succeed. Issue a diagnostic here. */ else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dcdfea4accb..7cce91789ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-04-15 Mark Mitchell + + PR c++/10381 + * g++.dg/parse/lookup3.C: New test. + 2003-04-15 J"orn Rennecke * gcc.c-torture/compile/20030415-1.c : New test. diff --git a/gcc/testsuite/g++.dg/parse/lookup3.C b/gcc/testsuite/g++.dg/parse/lookup3.C new file mode 100644 index 00000000000..d4bf7983030 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup3.C @@ -0,0 +1,12 @@ +struct X {}; + +template +struct Base { + static void foo () { + X::NONEXISTENT (); // { dg-error "" } + } +}; + +int main () { + Base<2>::foo (); +} diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp index a2861c0eefc..8105340cfcd 100644 --- a/gcc/testsuite/lib/prune.exp +++ b/gcc/testsuite/lib/prune.exp @@ -19,7 +19,7 @@ proc prune_gcc_output { text } { #send_user "Before:$text\n" - regsub -all "(^|\n)\[^\n\]*: In (function|member|method|(copy )?constructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text + regsub -all "(^|\n)\[^\n\]*: In ((static member )?function|member|method|(copy )?constructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*: At (top level|global scope):\[^\n\]*" $text "" text regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text regsub -all "(^|\n)Please submit.*instructions\[^\n\]*" $text "" text