From: Richard Biener Date: Fri, 17 Aug 2018 14:17:10 +0000 (+0000) Subject: backport: re PR c++/86763 (Wrong code comparing member of copy of a 237 byte object... X-Git-Tag: releases/gcc-7.4.0~200 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb094fdeb21f96b623d2c89c98d477c0871276a2;p=thirdparty%2Fgcc.git backport: re PR c++/86763 (Wrong code comparing member of copy of a 237 byte object with nontrivial default constructor on x86-64 arch) 2018-08-17 Richard Biener Backport from mainline 2018-08-02 Richard Biener PR c++/86763 * class.c (layout_class_type): Copy TYPE_TYPELESS_STORAGE to the CLASSTYPE_AS_BASE. * g++.dg/torture/pr86763.C: New testcase. From-SVN: r263621 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index af9feea0bc61..4bb74d28f6d6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2018-08-17 Richard Biener + + Backport from mainline + 2018-08-02 Richard Biener + + PR c++/86763 + * class.c (layout_class_type): Copy TYPE_TYPELESS_STORAGE + to the CLASSTYPE_AS_BASE. + 2018-08-10 Jason Merrill PR c++/86728 - C variadic generic lambda. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a1bf77589dcb..688cc0e58d33 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -6662,6 +6662,7 @@ layout_class_type (tree t, tree *virtuals_p) bitsize_int (BITS_PER_UNIT))); SET_TYPE_ALIGN (base_t, rli->record_align); TYPE_USER_ALIGN (base_t) = TYPE_USER_ALIGN (t); + TYPE_TYPELESS_STORAGE (base_t) = TYPE_TYPELESS_STORAGE (t); /* Copy the fields from T. */ next_field = &TYPE_FIELDS (base_t); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67b025aa5c3a..cd81a5060715 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-08-17 Richard Biener + + Backport from mainline + 2018-08-02 Richard Biener + + PR c++/86763 + * g++.dg/torture/pr86763.C: New testcase. + 2018-07-17 Eric Botcazou * gnat.dg/discr55.adb: New test. diff --git a/gcc/testsuite/g++.dg/torture/pr86763.C b/gcc/testsuite/g++.dg/torture/pr86763.C new file mode 100644 index 000000000000..6b79d561a60b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr86763.C @@ -0,0 +1,36 @@ +// { dg-do run } +// { dg-additional-options "-fschedule-insns2 -fstrict-aliasing" } + +#include +#include +#include +struct ID { + uint64_t value; +}; +uint64_t value(ID id) { return id.value; } +uint64_t gen { 1000 }; +struct Msg { + uint64_t time; + ID id; +}; +struct V { + V() { } + V(Msg const & msg) : msg(msg) { } + Msg & get() { return msg; } + Msg msg; + char pad[237 - sizeof(Msg)]; +}; +struct T : V { using V::V; }; +Msg init_msg() { + Msg msg; + timespec t; + clock_gettime(CLOCK_REALTIME, &t); + msg.time = t.tv_sec + t.tv_nsec; + msg.id.value = ++gen; + return msg; +} +int main() { + T t; + t = init_msg(); + assert(value(t.get().id) == 1001); +}