]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/86763 (Wrong code comparing member of copy of a 237 byte object...
authorRichard Biener <rguenther@suse.de>
Fri, 17 Aug 2018 14:17:10 +0000 (14:17 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 17 Aug 2018 14:17:10 +0000 (14:17 +0000)
2018-08-17  Richard Biener  <rguenther@suse.de>

Backport from mainline
2018-08-02  Richard Biener  <rguenther@suse.de>

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

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr86763.C [new file with mode: 0644]

index af9feea0bc613d5f965563e60c423389ff8ff5b9..4bb74d28f6d6962cfe17e79199a0cb37e3de9fba 100644 (file)
@@ -1,3 +1,12 @@
+2018-08-17  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2018-08-02  Richard Biener  <rguenther@suse.de>
+
+       PR c++/86763
+       * class.c (layout_class_type): Copy TYPE_TYPELESS_STORAGE
+       to the CLASSTYPE_AS_BASE.
+
 2018-08-10  Jason Merrill  <jason@redhat.com>
 
        PR c++/86728 - C variadic generic lambda.
index a1bf77589dcb232790916477d10f82d3faf90f72..688cc0e58d33bcc473adcac18084d03cff131bc4 100644 (file)
@@ -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);
index 67b025aa5c3aa53df0ae62b91090e005e8ebf232..cd81a50607150a88b95066e0c0b4583cd5232ebc 100644 (file)
@@ -1,3 +1,11 @@
+2018-08-17  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2018-08-02  Richard Biener  <rguenther@suse.de>
+
+       PR c++/86763
+       * g++.dg/torture/pr86763.C: New testcase.
+
 2018-07-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * 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 (file)
index 0000000..6b79d56
--- /dev/null
@@ -0,0 +1,36 @@
+// { dg-do run }
+// { dg-additional-options "-fschedule-insns2 -fstrict-aliasing" }
+
+#include <cstdint>
+#include <cassert>
+#include <time.h>
+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);
+}