+2018-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2017-09-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/82159
+ * gimplify.c (gimplify_modify_expr): Don't optimize away zero sized
+ lhs from calls if the lhs has addressable type.
+
2018-06-23 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/85989
side as statements and throw away the assignment. Do this after
gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
types properly. */
- if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
+ if (zero_sized_type (TREE_TYPE (*from_p))
+ && !want_value
+ /* Don't do this for calls that return addressable types, expand_call
+ relies on those having a lhs. */
+ && !(TREE_ADDRESSABLE (TREE_TYPE (*from_p))
+ && TREE_CODE (*from_p) == CALL_EXPR))
{
gimplify_stmt (from_p, pre_p);
gimplify_stmt (to_p, pre_p);
+2018-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2017-09-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/82159
+ * g++.dg/opt/pr82159.C: New test.
+
2018-06-23 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/85989
--- /dev/null
+// PR c++/82159
+// { dg-do compile }
+// { dg-options "" }
+
+template<int N>
+struct S
+{
+ ~S () {}
+ template<int M> S<M> foo () { return S<M> (); }
+ unsigned char data[N];
+};
+
+int
+main ()
+{
+ S<16> d;
+ S<0> t = d.foo<0> ();
+}