This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: c++/5577 (was: Re: c++/4862 and PRs...)
On Sat, Feb 02, 2002 at 09:55:19PM +0100, Paolo Carlini wrote:
> "H . J . Lu" wrote:
>
> > > How about c++/5577?? Does it fix this one too?? In that case it would be really nice
> > > to have it for 3.1 too...
> >
> > No, my patch doesn't fix 5577. It has been long time since I worked
> > on it last time. I don't have time to look into it. I am not sure if
> > they are related. Besides, my users haven't been bitten by it yet.
>
> I see.
> c++/5777 seems quite nasty, even the new parser for the time being chokes on it :-(
> (not EDG ;-)
>
Well, I have no idea what I am doing. But this patch seems to make gcc
to compile c++/5777 :-). But I don't know if it generates the correct
code or not.
H.J.
----
2002-02-03 H.J. Lu (hjl@gnu.org)
* gcc/cp/decl.c (lookup_name_real): Handle prefer_type == 3.
* parse.y (object): Handle LOOKUP_EXPR and COMPONENT_REF.
--- gcc/cp/decl.c.template Fri Feb 1 15:22:12 2002
+++ gcc/cp/decl.c Fri Feb 1 16:39:39 2002
@@ -6067,6 +6067,8 @@ lookup_name_real (name, prefer_type, non
else if ((flags & LOOKUP_PREFER_TYPES)
&& qualify_lookup (BINDING_TYPE (t), flags))
binding = BINDING_TYPE (t);
+ else if (prefer_type == 3)
+ binding = BINDING_VALUE (t);
else
binding = NULL_TREE;
--- gcc/cp/parse.y.template Fri Feb 1 15:22:13 2002
+++ gcc/cp/parse.y Sun Feb 3 00:44:13 2002
@@ -1779,11 +1779,79 @@ nodecls:
object:
primary '.'
- { got_object = TREE_TYPE ($$); }
+ {
+ tree name;
+ got_object = TREE_TYPE ($$);
+ name = $$;
+ while (TREE_CODE (name) == ADDR_EXPR
+ || TREE_CODE (name) == INDIRECT_REF
+ || TREE_CODE (name) == COMPONENT_REF)
+ if (TREE_CODE (name) == COMPONENT_REF)
+ name = TREE_OPERAND (name, 1);
+ else
+ name = TREE_OPERAND (name, 0);
+ if (got_object == NULL_TREE
+ && (TREE_CODE (name) == LOOKUP_EXPR
+ || TREE_CODE (name) == IDENTIFIER_NODE))
+ {
+ if (TREE_CODE (name) == LOOKUP_EXPR)
+ name = TREE_OPERAND (name, 0);
+ name = lookup_name (name, 3);
+ if (name)
+ {
+ got_object = TREE_TYPE (name);
+ if (got_object)
+ {
+ switch (TREE_CODE (got_object))
+ {
+ case POINTER_TYPE:
+ case REFERENCE_TYPE:
+ got_object = TREE_TYPE (got_object);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
| primary POINTSAT
{
+ tree name;
+ name = $$;
+ while (TREE_CODE (name) == ADDR_EXPR
+ || TREE_CODE (name) == INDIRECT_REF
+ || TREE_CODE (name) == COMPONENT_REF)
+ if (TREE_CODE (name) == COMPONENT_REF)
+ name = TREE_OPERAND (name, 1);
+ else
+ name = TREE_OPERAND (name, 0);
$$ = build_x_arrow ($$);
got_object = TREE_TYPE ($$);
+ if (got_object == NULL_TREE
+ && (TREE_CODE (name) == LOOKUP_EXPR
+ || TREE_CODE (name) == IDENTIFIER_NODE))
+ {
+ if (TREE_CODE (name) == LOOKUP_EXPR)
+ name = TREE_OPERAND (name, 0);
+ name = lookup_name (name, 3);
+ if (name)
+ {
+ got_object = TREE_TYPE (name);
+ if (got_object)
+ {
+ switch (TREE_CODE (got_object))
+ {
+ case POINTER_TYPE:
+ case REFERENCE_TYPE:
+ got_object = TREE_TYPE (got_object);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
}
;