This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [C++ Patch] PR 3761 (ICE in check_template_shadow)


I have looked at this bug before.  The real problem is
actually up in the parser.  The declaration

friend void Foo::func(void);

somehow causes the names inside Foo to be merged to the current
scope.  This triggers all sort of ambiguity.

--Kriang

Scott Brumbaugh wrote:
Hi,

Here is an attempt at fixing this bug.  My analysis was done on the
test code listed below. The error occurs because a TREE_LIST is passed
as an argument to check_template_shadow.  I traced this back to an
ambiguous lookup of the implicit operator= which is defined in both base
classes A and B.

This lookup is done in setup_class_bindings when it calls
lookup_member with the protect parameter = 2.  In this case
lookup_member will return a TREE_LIST node with TREE_TYPE set to
error_mark_node and TREE_VALUE set to a chain of ambiguous candidates.
This returned TREE_LIST is then passed to push_class_level_binding
which is the function that calls check_template_shadow.

To fix this I changed check_template_shadow by adding an explicit
check for a TREE_LIST argument with a TREE_TYPE of error_mark_node.
In this case the decl chain of ambiguous names is extracted and the
function continues on.

Here is a patch that implements this fix followed by a test case.
I have done a make bootstrap and make check-g++ on i686-pc-linux-gnu.


Thanks,


Scott Brumbaugh


2003-08-22 Scott Brumbaugh <scottb.lists@verizon.net>



PR C++/3761


	* pt.c (check_template_shadow): Look out for a TREE_LIST of
	ambiguous names.  Handle this list just as an OVERLOAD list.



Index: pt.c
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/cp/pt.c,v
retrieving revision 1.763
diff -c -3 -p -r1.763 pt.c
*** pt.c 21 Aug 2003 05:50:52 -0000 1.763
--- pt.c 22 Aug 2003 00:08:44 -0000
*************** check_template_shadow (tree decl)
*** 1932,1937 ****
--- 1932,1944 ----
/* Figure out what we're shadowing. */
if (TREE_CODE (decl) == OVERLOAD)
decl = OVL_CURRENT (decl);
+ /* lookup_member will return a TREE_LIST if a name is ambiguous, the
+ TREE_TYPE will be error_mark_node, TREE_VALUE will hold all the
+ ambiguous candidates. */
+ else if (TREE_CODE (decl) == TREE_LIST + && TREE_TYPE (decl) == error_mark_node)
+ decl = TREE_VALUE (decl);
+ olddecl = IDENTIFIER_VALUE (DECL_NAME (decl));
/* If there's no previous binding for this name, we're not shadowing



// { dg-do compile } // // PR 3761

struct A {};
struct B {};
template <class T>
struct Foo : A, B
{
void func(void);


    struct Nested
    {
        friend void Foo::func(void);
    };
};






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]