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.