]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/79085 (ICE with placement new to unaligned location)
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:32:55 +0000 (19:32 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:32:55 +0000 (19:32 +0200)
Backported from mainline
2018-03-15  Jakub Jelinek  <jakub@redhat.com>

PR c++/79085
* calls.c (expand_call): For TREE_ADDRESSABLE rettype ignore alignment
check and use address of target always.

* g++.dg/opt/pr79085.C: New test.

From-SVN: r262076

gcc/ChangeLog
gcc/calls.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr79085.C [new file with mode: 0644]

index 6923e64fbde2e7da73c972bef03bf54989e16830..070fee57a60baafcb2bb2c7c47b8c385bcbd92c4 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-03-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79085
+       * calls.c (expand_call): For TREE_ADDRESSABLE rettype ignore alignment
+       check and use address of target always.
+
        2018-03-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/84772
index c78059fb5199b13ab7cc807eedb64d2420f75e23..30c74ec961f876156e320a406cb95ec78164023b 100644 (file)
@@ -2557,9 +2557,14 @@ expand_call (tree exp, rtx target, int ignore)
        if (CALL_EXPR_RETURN_SLOT_OPT (exp)
            && target
            && MEM_P (target)
-           && !(MEM_ALIGN (target) < TYPE_ALIGN (rettype)
-                && SLOW_UNALIGNED_ACCESS (TYPE_MODE (rettype),
-                                          MEM_ALIGN (target))))
+           /* If rettype is addressable, we may not create a temporary.
+              If target is properly aligned at runtime and the compiler
+              just doesn't know about it, it will work fine, otherwise it
+              will be UB.  */
+           && (TREE_ADDRESSABLE (rettype)
+               || !(MEM_ALIGN (target) < TYPE_ALIGN (rettype)
+                    && SLOW_UNALIGNED_ACCESS (TYPE_MODE (rettype),
+                                              MEM_ALIGN (target)))))
          structure_value_addr = XEXP (target, 0);
        else
          {
index 8f9eb960f9d2ae252cd0a63753799248efd85119..818d6b60c4c297728bd1ce2c25474356d1b76f8d 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2018-03-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79085
+       * g++.dg/opt/pr79085.C: New test.
+
        PR c++/84222
        * g++.dg/warn/deprecated.C (T::member3): Change dg-warning to dg-bogus.
        * g++.dg/warn/deprecated-6.C (T::member3): Likewise.
diff --git a/gcc/testsuite/g++.dg/opt/pr79085.C b/gcc/testsuite/g++.dg/opt/pr79085.C
new file mode 100644 (file)
index 0000000..1d75d6a
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/79085
+// { dg-do compile }
+// { dg-options "-Os" }
+// { dg-additional-options "-mstrict-align" { target { aarch64*-*-* powerpc*-*-linux* powerpc*-*-elf* } } }
+
+void *operator new (__SIZE_TYPE__, void *p) { return p; }
+
+struct S
+{
+  S ();
+  S (const S &);
+  ~S (void);
+  int i;
+};
+
+S foo ();
+
+static char buf [sizeof (S) + 1];
+
+S *
+bar ()
+{
+  return new (buf + 1) S (foo ());
+}