https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86669
Bug ID: 86669 Summary: [5/6/7/8/9 regression] Complete object constructor clone omits length for a c++11 braced initialiser Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: iains at gcc dot gnu.org Target Milestone: --- Created attachment 44435 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44435&action=edit pre-processed and reduced code This applies to targets that do not allow (or have) alias support for constructor clones. c-reduce has obfuscated the variable names in the reduced code, of course ... The original code looks like this: ==== AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) : LegalizerInfo() { const LLT p0 = LLT::pointer(0, 64); const LLT s1 = LLT::scalar(1); const LLT s8 = LLT::scalar(8); const LLT s16 = LLT::scalar(16); const LLT s32 = LLT::scalar(32); const LLT s64 = LLT::scalar(64); const LLT s128 = LLT::scalar(128); const LLT v2s32 = LLT::vector(2, 32); const LLT v4s32 = LLT::vector(4, 32); const LLT v2s64 = LLT::vector(2, 64); for (auto Ty : {p0, s1, s8, s16, s32, s64}) setAction({/*G_IMPLICIT_DEF*/41, Ty}, Legal); ... } ===== The gimple for the base constructor contains: " try { D.2730 = {}; D.2730.i = 6; <<<<< OK _M_len is set D.2729[0] = e; D.2729[1] = f; D.2729[2] = g; D.2729[3] = h; D.2729[4] = i; D.2729[5] = j; D.2730.a = &D.2729; __for_range = &D.2730; __for_begin = std::initializer_list<llvm::J>::begin (__for_range); __for_end = std::initializer_list<llvm::J>::end (__for_range); " but for the complete constructor: " try { D.2745 = {}; <<< _M_len init missing D.2744[0] = e; D.2744[1] = f; D.2744[2] = g; D.2744[3] = h; D.2744[4] = i; D.2744[5] = j; D.2745.a = &D.2744; __for_range = &D.2745; __for_begin = std::initializer_list<llvm::J>::begin (__for_range); __for_end = std::initializer_list<llvm::J>::end (__for_range); <D.2808>: " ======== With clang .../bin/clang -cc1 -triple x86_64-apple-macosx10.12.0 -x c++-cpp-output AArch64LegalizerInfo-fmt.ii -O0 -S -std=c++11 -fvisibility-inlines-hidden -fno-rtti -o tc.s The complete constructor is rendered as a thunk calling the base constructor (not sure why we conclude this is not viable in GCC) ====== With GCC (all versions I've tried 5...trunk) we get the effect above. .../libexec/gcc/x86_64-apple-darwin14/7.3.0/cc1plus -fpreprocessed AArch64LegalizerInfo-fmt.ii -fPIC -quiet -mmacosx-version-min=10.10 -mtune=core2 -g3 -O0 -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -Wpedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -std=c++11 -fPIC -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -o tg.s ====== I took a look at what was happening in cp/optimize.c:maybe_clone_body() but couldn't see any special difference between the operations carried out to clone the base and the complete constructors.