https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108993
--- Comment #6 from Pablo Anigstein <panigstein at hotmail dot com> --- (In reply to Jonathan Wakely from comment #3) > (In reply to Pablo Anigstein from comment #2) > > (In reply to Andrew Pinski from comment #1) > > > Hmm, > > > I noticed that since GCC 7 with -std=c++17, the b.x is not initialized at > > > all. So the question I have is there a difference between C++ standards > > > here? > > Derived is an aggregate in C++17, so b{} does aggregate init, not value init. > > > > Note the issue is we call Base's constructor after doing the zero > > > initialization and the Base's constructor has a clobber in it which I > > > think > > > is correct. > > Maybe we should only clobber in the complete object constructor _ZN4BaseC1Ev > and not in _ZN4BaseC2Ev. > > > > This is all front-end generation and not exactly related to the > > > optimizations directly. > > > > There is no difference between C++ standards in this respect. > > Before C++11 there was no zero-init at all. Since C++11 the spec keeps > changing, but the effects of zero-init are substantially the same. But > Derived is an aggregate since C++17. Thank you for the correction. I still think there is non-conformance for all standards including C++17, I will post a modified example in a comment below. > > Aside: What does the comment "not a default constructor" mean in the > testcase? I guess he meant "user-provided".