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

Kriang Lerdsuwanakij lerdsuwa@users.sf.net
Sat Aug 23 18:09:00 GMT 2003


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);
>     };
> };
> 
> 





More information about the Gcc-patches mailing list