decl.c (build_ptrmemfunc_type): Allow error_mark_node.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 7 Nov 2000 13:58:21 +0000 (13:58 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 7 Nov 2000 13:58:21 +0000 (13:58 +0000)
cp:
* decl.c (build_ptrmemfunc_type): Allow error_mark_node.
testsuite:
* g++.old-deja/g++.pt/crash60.C: New test.

From-SVN: r37289

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/crash60.C [new file with mode: 0644]

index b79e31056d589472b00d21361f9b765039b1d14c..62edaf5401c1d409e9cad85a05b073d95e479aea 100644 (file)
@@ -1,3 +1,7 @@
+2000-11-07  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * decl.c (build_ptrmemfunc_type): Allow error_mark_node.
+
 2000-11-05  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * Make-lang.in (c++.distdir): Remove.
index d4d9bbaa80d225f473a366879c745fdf6777a464..f4d170a9f3073c1d7444c7a499b9608df8ec45d1 100644 (file)
@@ -9215,6 +9215,9 @@ build_ptrmemfunc_type (type)
   tree u;
   tree unqualified_variant = NULL_TREE;
 
+  if (type == error_mark_node)
+    return type;
+  
   /* If a canonical type already exists for this type, use it.  We use
      this method instead of type_hash_canon, because it only does a
      simple equality check on the list of field members.  */
index 9940b989a933448817b9313db2a893e7f81a83ee..61bc1c18beb816cf6ab2125263664c091c5d6cc1 100644 (file)
@@ -1,3 +1,7 @@
+2000-11-07  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/crash60.C: New test.
+
 2000-11-06  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.old-deja/g++.other/crash24.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash60.C b/gcc/testsuite/g++.old-deja/g++.pt/crash60.C
new file mode 100644 (file)
index 0000000..3d7eb1c
--- /dev/null
@@ -0,0 +1,18 @@
+// Build don't link:
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Nov 2000 <nathan@codesourcery.com>
+
+// We ICE'd rather than fail to instantiate.
+
+template< typename SID, class SDR >
+void k( SID sid, SDR* p,
+ void (SDR::*)
+ ( typename SID::T ) );
+
+struct E { };
+struct S { void f( int ); };
+
+void f()
+{
+  k( E(), (S*)0, &S::f );   // ERROR - no match
+}