------- Additional Comments From mark at codesourcery dot com  2005-03-06 18:02 
-------
Subject: Re: [PR c++/20103] failure to gimplify constructors for addressable
 types

Alexandre Oliva wrote:

> +    case TARGET_EXPR:
> +      {
> +     tree r = tsubst_copy (t, args, complain, in_decl);
> +
> +     TREE_TYPE (r) = RECUR (TREE_TYPE (t));
> +     TARGET_EXPR_SLOT (r) = RECUR (TARGET_EXPR_SLOT (t));
> +     TARGET_EXPR_INITIAL (r) = RECUR (TARGET_EXPR_INITIAL (t));
> +     TARGET_EXPR_CLEANUP (r) = RECUR (TARGET_EXPR_CLEANUP (t));
> +
> +     if (TREE_TYPE (TARGET_EXPR_SLOT (t))
> +         == TREE_TYPE (TARGET_EXPR_INITIAL (t)))
> +       TREE_TYPE (TARGET_EXPR_SLOT (r)) =
> +         TREE_TYPE (TARGET_EXPR_INITIAL (r));
> +
> +     if (TREE_TYPE (t) == TREE_TYPE (TARGET_EXPR_SLOT (t)))
> +       TREE_TYPE (r) = TREE_TYPE (TARGET_EXPR_SLOT (r));
> +
> +     return r;

This doesn't look quite right.  First, we're trying to get rid of 
tsubst_copy; we should not add new calls.  You should do the RECURs 
here, and then build up the new node.  And, the manipulations of 
TREE_TYPE don't make sense: (a) using "==" to compare types is almost 
always wrong, and (b) the RECURs should already maintain the invariant 
you're trying to maintain.



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20103

Reply via email to