------- Additional Comments From aoliva at gcc dot gnu dot org  2005-03-11 
19:29 -------
Subject: Re: [PR c++/20103] failure to gimplify constructors for addressable 
types

On Mar 11, 2005, Richard Henderson <[EMAIL PROTECTED]> wrote:

> On Tue, Mar 08, 2005 at 05:42:57PM -0300, Alexandre Oliva wrote:
>> The change to the gimplify.c is needed to avoid having
>> gimple_add_tmp_var twice for the variable, once while expanding the
>> declaration/initialization, once while expanding the clean-ups.

> Can you say more about how this comes to be?  It doesn't make
> sense to me...

Just a matter of misinterpreting observed behavior :-(

Here's the correct sequence of events without the change:

gimplify_compound_literal_expr calls gimple_add_tmp_var, and then
gimplify_and_add for the statement list containing the decl of the
temporary variable

gimplify_and_add calls gimplify_stmt for the stmt list, that calls
calls gimplify_expr, that calls gimplify_decl_expr, that calls
gimple_add_tmp_var again.

I should now try to figure out why it is that in C it doesn't get
called twice, in but in C++ it does.

I remember I tried to remove the first call from
gimplify_compound_literal_expr, but that didn't work because the
presence of the initializer would cause gimplify_decl_expr to build a
modify_expr referencing the decl, and this fails if the decl isn't,
erhm, bound yet.  Perhaps I should move the call to gimple_add_tmp_var
in gimplify_decl_expr before the init stmt; this even makes sense to
me.


Incidentally, we don't actually generate cleanups for these temps,
unlike the target_expr case, so we fail to call dtors for them.  Ugh.
Fixing this will take some more work.  Patch withdrawn for the time
being.



-- 


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

Reply via email to