re PR c++/10381 (Accepts call to inexistent function)
authorMark Mitchell <mark@codesourcery.com>
Tue, 15 Apr 2003 20:23:36 +0000 (20:23 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 15 Apr 2003 20:23:36 +0000 (20:23 +0000)
PR c++/10381
* parser.c (cp_parser_primary_expression): Reorganize logic for
dealing with name lookup failures.

PR c++/10381
* g++.dg/parse/lookup3.C: New test.

From-SVN: r65656

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/lookup3.C [new file with mode: 0644]
gcc/testsuite/lib/prune.exp

index 3c1055b345ec787a7cf37bbf6f9c7df3927f447b..7ce14982dd1e46da4aeb5515757bc2ef1eb2e2d5 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-15  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/10381
+       * parser.c (cp_parser_primary_expression): Reorganize logic for
+       dealing with name lookup failures.
+
 2003-04-15  Jason Merrill  <jason@redhat.com>
 
        * decl2.c (mark_used): Don't instantiate anything if
index 8f992c58327b188bc85177e91251ba9efedd1b1d..751508906b1b79c0bf16dabf591f4318162fe3fc 100644 (file)
@@ -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
index dcdfea4accb9260f4e9f0f4d66b1214fa956e2bc..7cce91789ca3b6c3f397743678055422b9178f4e 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-15  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/10381
+       * g++.dg/parse/lookup3.C: New test.
+
 2003-04-15  J"orn Rennecke <joern.rennecke@superh.com>
 
        * 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 (file)
index 0000000..d4bf798
--- /dev/null
@@ -0,0 +1,12 @@
+struct X {};
+
+template <int>
+struct Base {
+    static void foo () { 
+      X::NONEXISTENT (); // { dg-error "" }
+    }
+};
+
+int main () {
+  Base<2>::foo ();
+}
index a2861c0eefcdd18d2fb3231aaf8648bc860d4ae6..8105340cfcd7ebd7c5cd7cccfb03be807dd74ae5 100644 (file)
@@ -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