On Wed, 8 Jan 2025, Jan Hubicka wrote:

> > On Tue, 10 Dec 2024, Jan Hubicka wrote:
> > 
> > > Hi,
> > > int:
> > > struct foo
> > > {
> > >   int a;
> > >   void bar() const;
> > >   ~foo()
> > >   {
> > >     if (a != 42)
> > >       __builtin_abort ();
> > >   }
> > > };
> > > __attribute__ ((noinline))
> > > void test(const struct foo a)
> > > {
> > >         int b = a.a;
> > >         a.bar();
> > >         if (a.a != b)
> > >           __builtin_printf ("optimize me away");
> > > }
> > > struct foo is passed by invisible reference. As discussed in the PR,
> > > since it is declared const, it can not change before function test
> > > returns.  This makes it possible to optimize out the conditional.
> > 
> > Doesn't this break the case where 'a' is declared mutable?
> Hmm, good point.  declaring a mutable definitely lets me to chagne value
> in bar.  I am adding Jason and Jonatan to CC.
> We could probably special case types containing mutable if such code is
> valid?

I think there should be a way to figure out already, otherwise a global

const foo x;

would fault if put into .rodata.  But maybe classes with mutable
members are never POD and thus always runtime initialized?

Richard.

Reply via email to