Jakub Jelinek <ja...@redhat.com> wrote:
>On Tue, Dec 31, 2013 at 08:39:02AM +0100, Richard Biener wrote:
>> >That said, fold_stmt callers have to be prepared to handle say a
>normal
>> >call becoming noreturn call, consider say:
>> >
>> >struct A { virtual int foo (); };
>> >struct B : public A { int foo () __attribute__((noreturn)); };
>> >int B::foo () { __builtin_exit (0); }
>> >int bar ()
>> >{
>> >  B b;
>> >  B *p = &b;
>> >  return p->foo ();
>> >}
>> 
>> Is that a valid specialization though?
>
>I think so, after all don't we set noreturn attribute automatically
>even if it is missing when IPA can prove the function never returns?
>If we fold_stmt after that, the above testcase even without explicit
>noreturn attribute would need cfg cleanup.
>
>Perhaps gimple_fold_call should punt and not change fndecl if !inplace
>if some call flags have changed that would require cfg cleanup, making
>at least fold_stmt_inplace callers not having to deal with it, and make
>sure fold_stmt callers schedule cleanup_cfg when fold_stmt returns
>true?

It would be nice to audit callers and finally document what callers are 
required to do ... I can look at this next week.  I agree that the in place 
variant should avoid these kind of side-effects.

Meanwhile your patch is ok.

Thanks,
Richard.

>       Jakub


Reply via email to