From d48ebde10d34cfc027aff6f1e1bb6f7a52835d6d Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 7 Nov 2000 13:58:21 +0000 Subject: [PATCH] decl.c (build_ptrmemfunc_type): Allow error_mark_node. 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 | 4 ++++ gcc/cp/decl.c | 3 +++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.old-deja/g++.pt/crash60.C | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash60.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b79e31056d5..62edaf5401c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2000-11-07 Nathan Sidwell + + * decl.c (build_ptrmemfunc_type): Allow error_mark_node. + 2000-11-05 Joseph S. Myers * Make-lang.in (c++.distdir): Remove. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d4d9bbaa80d..f4d170a9f30 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9940b989a93..61bc1c18beb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-11-07 Nathan Sidwell + + * g++.old-deja/g++.pt/crash60.C: New test. + 2000-11-06 Jakub Jelinek * 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 index 00000000000..3d7eb1ce3ba --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash60.C @@ -0,0 +1,18 @@ +// Build don't link: +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Nov 2000 + +// 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 +} -- 2.30.2