OSDN Git Service

PR c++/14360
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Mar 2004 02:06:18 +0000 (02:06 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Mar 2004 02:06:18 +0000 (02:06 +0000)
* parser.c (cp_parser_postfix_expression): Do not perform Koenig
lookup if ordinary name-lookup finds a non-function.
* pt.c (tsubst_copy_and_build): Likewise.

PR c++/14361
* parser.c (cp_parser_late_parsing_default_args): Check that there
are no extra tokens after the end of the default-argument
expression.

PR c++/14360
* g++.old-deja/g++.ns/koenig5.C: Remove some error markers.

PR c++/14361
* g++.dg/parse/defarg7.C: New test.

PR c++/14359
* g++.dg/template/friend26.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78739 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/defarg7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/friend26.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.ns/koenig5.C

index 02b99e4..21b0172 100644 (file)
@@ -5,6 +5,18 @@
 
 2004-03-01  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/14360
+       * parser.c (cp_parser_postfix_expression): Do not perform Koenig
+       lookup if ordinary name-lookup finds a non-function.
+       * pt.c (tsubst_copy_and_build): Likewise.
+
+       PR c++/14361
+       * parser.c (cp_parser_late_parsing_default_args): Check that there
+       are no extra tokens after the end of the default-argument
+       expression.
+       
+2004-03-01  Mark Mitchell  <mark@codesourcery.com>
+
        PR c++/14324
        * lex.c (retrofit_lang_decl): Treat entities with no linkage as
        having C++ linkage for name-mangling purposes.
index 77b5795..9184f0e 100644 (file)
@@ -3810,9 +3810,11 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p)
            koenig_p = false;
            if (idk == CP_ID_KIND_UNQUALIFIED)
              {
+               /* We do not perform argument-dependent lookup if
+                  normal lookup finds a non-function, in accordance
+                  with the expected resolution of DR 218.  */
                if (args
                    && (is_overloaded_fn (postfix_expression)
-                       || DECL_P (postfix_expression)
                        || TREE_CODE (postfix_expression) == IDENTIFIER_NODE))
                  {
                    koenig_p = true;
@@ -14757,6 +14759,12 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
       if (DECL_CLASS_SCOPE_P (fn))
        pop_nested_class ();
 
+      /* If the token stream has not been completely used up, then
+        there was extra junk after the end of the default
+        argument.  */
+      if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
+       cp_parser_error (parser, "expected `,'");
+
        /* Restore saved state.  */
       parser->lexer = saved_lexer;
       parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
index 20056eb..8f9a7bd 100644 (file)
@@ -8361,10 +8361,12 @@ tsubst_copy_and_build (tree t,
          }
 
        call_args = RECUR (TREE_OPERAND (t, 1));
-         
+
+       /* We do not perform argument-dependent lookup if normal
+          lookup finds a non-function, in accordance with the
+          expected resolution of DR 218.  */
        if (koenig_p
            && (is_overloaded_fn (function)
-               || DECL_P (function)
                || TREE_CODE (function) == IDENTIFIER_NODE))
          function = perform_koenig_lookup (function, call_args);
 
index 459ff66..b2df61f 100644 (file)
@@ -1,5 +1,16 @@
 2004-03-01  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/14360
+       * g++.old-deja/g++.ns/koenig5.C: Remove some error markers.
+       
+       PR c++/14361
+       * g++.dg/parse/defarg7.C: New test.
+
+       PR c++/14359
+       * g++.dg/template/friend26.C: New test.
+
+2004-03-01  Mark Mitchell  <mark@codesourcery.com>
+
        PR c++/14324
        * g++.dg/abi/mangle21.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/parse/defarg7.C b/gcc/testsuite/g++.dg/parse/defarg7.C
new file mode 100644 (file)
index 0000000..c1f75ce
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/14361
+
+class A {
+  A ( int n=0 int n ); // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/template/friend26.C b/gcc/testsuite/g++.dg/template/friend26.C
new file mode 100644 (file)
index 0000000..3cf659d
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/14359
+
+template<typename> struct A {};
+
+template<typename> struct B
+{
+    template<typename T> friend void foo(const A<T>& a, const B&) { a; }
+};
+
+void bar()
+{
+    A<void> a;
+    B<void> b;
+    foo(a,b);
+}
index 84af9f1..d84fc8d 100644 (file)
@@ -1,16 +1,18 @@
 // { dg-do assemble  }
 // To find function pointers in Koenig lookup is ok as long as we only find one.
 namespace A{
-  void foo();             // { dg-error "" } 
+  void foo();             
   struct X{};
   void (*bar)(X*)=0;
 }
 using A::X;
 
-void (*foo)(X*)=0;        // { dg-error "" } 
+void (*foo)(X*)=0;        
 
 void g()
 {
-  foo(new X);            // { dg-error "" } both objects and functions found
+  foo(new X);            // ok -- DR 218 says that we find the global
+                        // foo variable first, and therefore do not
+                        // perform argument-dependent lookup.
   bar(new X);            // ok
 }