From 3fc5037bd1f8b59ab08315ff0fa3318b6324e3ba Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 8 Apr 1999 13:05:50 +0000 Subject: [PATCH] * search.c (template_self_reference_p): Tweak. From-SVN: r26296 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/init.c | 7 +++---- gcc/cp/search.c | 1 + .../g++.old-deja/g++.other/sizeof1.C | 12 +++++++++++ gcc/testsuite/g++.old-deja/g++.pt/crash34.C | 20 +++++++++++++++++++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/sizeof1.C create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash34.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5dd92144328..21cf5a909f9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +1999-04-08 Mark Mitchell + + * search.c (template_self_reference_p): Tweak. + +1999-04-07 Mark Mitchell + + * init.c (build_offset_ref): Don't build yet another weird data + structure to describe overloaded functions. + 1999-04-06 Mark Mitchell * cp-tree.h (BASELINK_P): New macro. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 2769765ef63..c51815f1dcf 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1572,7 +1572,7 @@ build_offset_ref (type, name) /* A lot of this logic is now handled in lookup_field and lookup_fnfield. */ - if (member && TREE_CODE (member) == TREE_LIST) + if (member && BASELINK_P (member)) { /* Go from the TREE_BASELINK to the member function info. */ tree fnfields = member; @@ -1627,9 +1627,8 @@ build_offset_ref (type, name) && ! allocation_temporary_p ()) fnfields = copy_list (fnfields); - t = build_tree_list (error_mark_node, fnfields); - TREE_TYPE (t) = build_offset_type (type, unknown_type_node); - return t; + TREE_TYPE (fnfields) = build_offset_type (type, unknown_type_node); + return fnfields; } t = member; diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 7a13a9f1e0d..4b90e7ebc76 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1190,6 +1190,7 @@ template_self_reference_p (type, decl) tree decl; { return (CLASSTYPE_USE_TEMPLATE (type) + && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)) && TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == constructor_name (type)); diff --git a/gcc/testsuite/g++.old-deja/g++.other/sizeof1.C b/gcc/testsuite/g++.old-deja/g++.other/sizeof1.C new file mode 100644 index 00000000000..6b547ae912e --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/sizeof1.C @@ -0,0 +1,12 @@ +// Build don't link: +// Origin: Jason Merrill + +struct X { + int f (); + int f (int); +}; + +void f(int i) +{ + i = sizeof(X::f); // ERROR - cannot take sizeof a member function +} diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash34.C b/gcc/testsuite/g++.old-deja/g++.pt/crash34.C new file mode 100644 index 00000000000..d178a406fb2 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash34.C @@ -0,0 +1,20 @@ +// Build don't link: +// Origin: Theodore Papadopoulo + +template +class A { +public: + class B { }; + class C: public B { + public: + C(A&):B() { } + }; + C f() { return C(*this); } +}; + +int +main() +{ + A a; + a.f(); +}