re PR c++/26739 (ICE in g++.old-deja/g++.pt/friend36.C)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Wed, 19 Apr 2006 18:07:19 +0000 (18:07 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Wed, 19 Apr 2006 18:07:19 +0000 (18:07 +0000)
PR c++/26739
* pt.c (tsubst_friend_function): Return early if
pushdecl_namespace_level fails.

* g++.old-deja/g++.pt/friend36.C: Adjust error markers.

From-SVN: r113090

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/friend36.C

index aa5b60ec0d5c4510f094bb2ce8de6957fcc30952..c3df66dcb3298bac84f35cb782ad85cf07ce6a2a 100644 (file)
@@ -1,5 +1,9 @@
 2006-04-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+       PR c++/26739
+       * pt.c (tsubst_friend_function): Return early if
+       pushdecl_namespace_level fails.
+
        PR c++/26036
        * typeck.c (convert_arguments): Return error_mark_node instead of
        error_mark_list.
index 83bfd1259240dbe5a452dcf935e97b28d8c8fae6..fbe01dbfb4188819aa6a2c8ec12861bbc4be90cd 100644 (file)
@@ -5230,6 +5230,9 @@ tsubst_friend_function (tree decl, tree args)
       old_decl = pushdecl_namespace_level (new_friend, /*is_friend=*/true);
       pop_nested_namespace (ns);
 
+      if (old_decl == error_mark_node)
+       return error_mark_node;
+
       if (old_decl != new_friend)
        {
          /* This new friend declaration matched an existing
index 0e0367b99a06b4e455468cd1ce37b6dbbb1b2b7a..381ed85732b9251fb4eba83d40f5e3e5a2423c85 100644 (file)
@@ -1,5 +1,8 @@
 2006-04-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+       PR c++/26739
+       * g++.old-deja/g++.pt/friend36.C: Adjust error markers.
+
        PR c++/26036
        * g++.dg/expr/call3.C: New test.
 
index 051803b2e3dbeb2a02f2ed4972a6f573e5327168..f5cb8d40a0698b360b7e36bcaecdf8d36700a728 100644 (file)
@@ -1,12 +1,12 @@
 // { dg-do assemble  }
 
 template <class T>
-void f(T) {} // { dg-error "" } previously defined here
+void f(T) {} // { dg-error "previously" }
 
 template <class U>
 struct S {
   template <class T>
-  friend void f(T) {} // { dg-error "" } redeclaration
+  friend void f(T) {} // { dg-error "redefinition" }
 };
 
 S<int> si;